|
| 1 | +--- |
| 2 | +name: django |
| 3 | +description: Best practices for Django web development including models, views, templates, and testing. |
| 4 | +--- |
| 5 | + |
| 6 | +# Skill: Django |
| 7 | + |
| 8 | +Best practices for Django web development including models, views, templates, and testing. |
| 9 | + |
| 10 | +## When to Use |
| 11 | + |
| 12 | +Apply this skill when working with Django projects — models, views, URL routing, templates, forms, admin, and management commands. |
| 13 | + |
| 14 | +## Project Structure |
| 15 | + |
| 16 | +- Follow the standard Django app layout: `models.py`, `views.py`, `urls.py`, `admin.py`, `tests.py`, `forms.py`. |
| 17 | +- Keep each app focused on a single domain concept; avoid "god apps" with unrelated models. |
| 18 | +- Use `settings/base.py`, `settings/dev.py`, `settings/prod.py` for environment-specific configuration. |
| 19 | + |
| 20 | +## Models |
| 21 | + |
| 22 | +- Always define `__str__` on models for admin and debugging readability. |
| 23 | +- Use `Meta.ordering` sparingly — it adds `ORDER BY` to every query. Prefer explicit `.order_by()` on querysets. |
| 24 | +- Use database indexes (`db_index=True`, `Meta.indexes`) for fields that appear in `filter()` / `order_by()`. |
| 25 | +- Prefer `CharField` with `choices` (or `TextChoices` / `IntegerChoices`) over bare strings for constrained fields. |
| 26 | +- Use `F()` expressions and `Q()` objects for complex queries to avoid race conditions and improve readability. |
| 27 | + |
| 28 | +## Views |
| 29 | + |
| 30 | +- Prefer class-based views (CBVs) for CRUD; prefer function-based views for one-off logic. |
| 31 | +- Always explicitly set `queryset` or override `get_queryset()` — never rely on mutable class-level state. |
| 32 | +- Use `select_related()` and `prefetch_related()` to avoid N+1 query problems. |
| 33 | +- Set `LOGIN_URL` and use `@login_required` / `LoginRequiredMixin` consistently. |
| 34 | + |
| 35 | +## Testing |
| 36 | + |
| 37 | +- Use `pytest-django` with `@pytest.mark.django_db` for database access. |
| 38 | +- Prefer `TestCase` or `TransactionTestCase` only when explicit transaction control is needed; otherwise use pytest fixtures. |
| 39 | +- Use `RequestFactory` or `Client` to test views without starting a server. |
| 40 | +- Use `baker.make()` (model-bakery) or factories instead of manual model construction in tests. |
| 41 | + |
| 42 | +## Pitfalls |
| 43 | + |
| 44 | +- Never do blocking I/O in async views without wrapping in `sync_to_async`. |
| 45 | +- Avoid importing models at module level in `settings.py` or `urls.py` (circular imports). |
| 46 | +- Never store secrets in `settings.py` — use environment variables. |
| 47 | +- Avoid raw SQL unless the ORM genuinely cannot express the query. |
0 commit comments