Convenções e boas práticas Django — Claude Code Skill
Esta skill do Claude Code fornece orientação automática para desenvolvimento Django, garantindo que o código gerado ou modificado pelo Claude Code siga as boas práticas da comunidade e a filosofia de design do Django.
Quando esta skill se aplica
Ativa quando a solicitação do usuário envolve:
- Criar ou modificar models, views, forms, serializers ou templates Django
- Configurar settings, URLs ou middleware do Django
- Trabalhar com queries do ORM Django
- Configurar apps ou estrutura de projeto Django
- Escrever management commands do Django
- Trabalhar com signals, managers ou querysets do Django
Convenções de estrutura do projeto
Organização do app
app_name/
├── __init__.py
├── admin.py # Registro de admin dos modelos
├── apps.py # Configuração do app
├── models.py # Modelos de dados (dividir em pacote models/ se >5 modelos)
├── views.py # Views (dividir em pacote views/ se >10 views)
├── serializers.py # Serializers DRF (se usar DRF)
├── urls.py # Configuração de URLs do app
├── forms.py # Formulários Django
├── managers.py # Managers e querysets customizados
├── services.py # Lógica de negócio (manter views enxutas)
├── selectors.py # Queries de leitura complexas (opcional, para projetos grandes)
├── signals.py # Handlers de signals
├── tasks.py # Tasks Celery/assíncronas
├── constants.py # Constantes do app
├── exceptions.py # Exceções customizadas
├── permissions.py # Permissões DRF ou customizadas
├── middleware.py # Middleware customizado
├── templatetags/ # Template tags customizadas
│ └── app_name_tags.py
├── templates/
│ └── app_name/ # Templates com namespace
├── static/
│ └── app_name/ # Arquivos estáticos com namespace
├── migrations/
├── tests/
│ ├── __init__.py
│ ├── test_models.py
│ ├── test_views.py
│ ├── test_forms.py
│ └── factories.py # Factories de modelos (factory_boy)
└── fixtures/ # Dados de teste (prefira factories)
Quando dividir em pacotes
models.py > 300 linhas ou > 5 modelos → dividir em pacote models/
views.py > 500 linhas ou > 10 views → dividir em pacote views/
- Sempre use
__init__.py com imports explícitos ao dividir
Convenções de modelo
Ordenação de campos
- Chave primária (se customizada)
- Campos regulares (CharField, TextField, IntegerField, etc.)
- Campos de relacionamento (ForeignKey, M2M, O2O)
- Campos de timestamp (created_at, updated_at)
Componentes obrigatórios do modelo
class MyModel(models.Model):
# campos...
class Meta:
verbose_name = "my model"
verbose_name_plural = "my models"
ordering = ["-created_at"]
def __str__(self):
return self.name # Sempre implemente __str__
Regras de nomenclatura
- Nomes de modelo:
PascalCase, singular (Post, não Posts)
- Campos:
snake_case
related_name de ForeignKey: snake_case no plural do modelo filho (posts, comments)
- BooleanField: prefixo com
is_, has_, can_, should_ (is_active, has_paid)
- DateTimeField: sufixo com
_at (created_at, published_at)
- DateField: sufixo com
_date ou _on (birth_date, hired_on)
Padrões comuns
- Sempre adicione timestamps
created_at e updated_at
- Use
settings.AUTH_USER_MODEL em vez de User diretamente para ForeignKeys
- Use
uuid.uuid4 para IDs públicos, mantenha PK auto-incremento para uso interno
- Prefira
TextChoices / IntegerChoices em vez de tuplas de choices brutas
- Use objetos
F() e Q() em vez de SQL bruto
- Use
select_related() para FK/O2O e prefetch_related() para M2M/FK reversa
Convenções de view
Prefira Class-Based Views (CBVs)
- Use as views genéricas do Django quando se encaixarem
- Mantenha views enxutas — mova lógica de negócio para
services.py
- Use mixins para comportamento compartilhado
Padrão de view
# views.py — enxuta, delega para services
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
form_class = PostForm
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
# services.py — lógica de negócio
def publish_post(post: Post, user: User) -> Post:
if not user.has_perm("blog.publish_post"):
raise PermissionDenied
post.published = True
post.published_at = timezone.now()
post.save(update_fields=["published", "published_at", "updated_at"])
return post
Convenções de settings
- Divida settings:
settings/base.py, settings/local.py, settings/production.py
- Use variáveis de ambiente para segredos (via
python-decouple ou django-environ)
- Nunca comite segredos, arquivos
.env ou SECRET_KEY no controle de versão
Convenções de URL
- Use
path() em vez de re_path() a menos que regex seja realmente necessário
- Sempre defina
app_name no urls.py do app para namespacing
- Sempre use
name= em cada padrão de URL
- Use
reverse() ou {% url %} — nunca escreva URLs fixas no código
Convenções de teste
- Use
pytest-django em vez do test runner embutido do Django
- Use
factory_boy para dados de teste em vez de fixtures
- Nomeie arquivos de teste:
test_<módulo>.py
- Nomeie funções de teste:
test_<o_que_testa>_<comportamento_esperado>
- Use
APIClient para testes de endpoints DRF
Ordenação de imports
Siga os padrões do isort:
- Biblioteca padrão
- Pacotes de terceiros
- Imports do Django
- Imports locais do app
Lembretes de segurança
- Sempre use
{% csrf_token %} em formulários
- Use
get_object_or_404() em vez de .get() simples nas views
- Valide e sanitize toda entrada do usuário
- Use o ORM do Django — evite SQL bruto a menos que absolutamente necessário
- Defina
AUTH_PASSWORD_VALIDATORS em produção
- Use configurações
SECURE_* em produção (HSTS, redirecionamento SSL, etc.)
Source: lucasviana78/django-claude-kont — distributed by TomeVault.
1---2name: django-conventions3description: Esta skill deve ser usada quando o usuário está trabalhando em um projeto Django — criando models, views, forms, templates, URLs, signals, managers ou qualquer código relacionado ao Django. Fornece orientação automática de convenções e boas práticas. Use when this capability is needed.4---56# Convenções e boas práticas Django — Claude Code Skill78Esta skill do Claude Code fornece orientação automática para desenvolvimento Django, garantindo que o código gerado ou modificado pelo Claude Code siga as boas práticas da comunidade e a filosofia de design do Django.910## Quando esta skill se aplica1112Ativa quando a solicitação do usuário envolve:13- Criar ou modificar models, views, forms, serializers ou templates Django14- Configurar settings, URLs ou middleware do Django15- Trabalhar com queries do ORM Django16- Configurar apps ou estrutura de projeto Django17- Escrever management commands do Django18- Trabalhar com signals, managers ou querysets do Django1920## Convenções de estrutura do projeto2122### Organização do app2324```25app_name/26├── __init__.py27├── admin.py # Registro de admin dos modelos28├── apps.py # Configuração do app29├── models.py # Modelos de dados (dividir em pacote models/ se >5 modelos)30├── views.py # Views (dividir em pacote views/ se >10 views)31├── serializers.py # Serializers DRF (se usar DRF)32├── urls.py # Configuração de URLs do app33├── forms.py # Formulários Django34├── managers.py # Managers e querysets customizados35├── services.py # Lógica de negócio (manter views enxutas)36├── selectors.py # Queries de leitura complexas (opcional, para projetos grandes)37├── signals.py # Handlers de signals38├── tasks.py # Tasks Celery/assíncronas39├── constants.py # Constantes do app40├── exceptions.py # Exceções customizadas41├── permissions.py # Permissões DRF ou customizadas42├── middleware.py # Middleware customizado43├── templatetags/ # Template tags customizadas44│ └── app_name_tags.py45├── templates/46│ └── app_name/ # Templates com namespace47├── static/48│ └── app_name/ # Arquivos estáticos com namespace49├── migrations/50├── tests/51│ ├── __init__.py52│ ├── test_models.py53│ ├── test_views.py54│ ├── test_forms.py55│ └── factories.py # Factories de modelos (factory_boy)56└── fixtures/ # Dados de teste (prefira factories)57```5859### Quando dividir em pacotes6061- `models.py` > 300 linhas ou > 5 modelos → dividir em pacote `models/`62- `views.py` > 500 linhas ou > 10 views → dividir em pacote `views/`63- Sempre use `__init__.py` com imports explícitos ao dividir6465## Convenções de modelo6667### Ordenação de campos68691. Chave primária (se customizada)702. Campos regulares (CharField, TextField, IntegerField, etc.)713. Campos de relacionamento (ForeignKey, M2M, O2O)724. Campos de timestamp (created_at, updated_at)7374### Componentes obrigatórios do modelo7576```python77class MyModel(models.Model):78 # campos...7980 class Meta:81 verbose_name = "my model"82 verbose_name_plural = "my models"83 ordering = ["-created_at"]8485 def __str__(self):86 return self.name # Sempre implemente __str__87```8889### Regras de nomenclatura9091- Nomes de modelo: `PascalCase`, singular (`Post`, não `Posts`)92- Campos: `snake_case`93- `related_name` de ForeignKey: snake_case no plural do modelo filho (`posts`, `comments`)94- BooleanField: prefixo com `is_`, `has_`, `can_`, `should_` (`is_active`, `has_paid`)95- DateTimeField: sufixo com `_at` (`created_at`, `published_at`)96- DateField: sufixo com `_date` ou `_on` (`birth_date`, `hired_on`)9798### Padrões comuns99100- Sempre adicione timestamps `created_at` e `updated_at`101- Use `settings.AUTH_USER_MODEL` em vez de `User` diretamente para ForeignKeys102- Use `uuid.uuid4` para IDs públicos, mantenha PK auto-incremento para uso interno103- Prefira `TextChoices` / `IntegerChoices` em vez de tuplas de choices brutas104- Use objetos `F()` e `Q()` em vez de SQL bruto105- Use `select_related()` para FK/O2O e `prefetch_related()` para M2M/FK reversa106107## Convenções de view108109### Prefira Class-Based Views (CBVs)110111- Use as views genéricas do Django quando se encaixarem112- Mantenha views enxutas — mova lógica de negócio para `services.py`113- Use mixins para comportamento compartilhado114115### Padrão de view116117```python118# views.py — enxuta, delega para services119class PostCreateView(LoginRequiredMixin, CreateView):120 model = Post121 form_class = PostForm122123 def form_valid(self, form):124 form.instance.author = self.request.user125 return super().form_valid(form)126```127128```python129# services.py — lógica de negócio130def publish_post(post: Post, user: User) -> Post:131 if not user.has_perm("blog.publish_post"):132 raise PermissionDenied133 post.published = True134 post.published_at = timezone.now()135 post.save(update_fields=["published", "published_at", "updated_at"])136 return post137```138139## Convenções de settings140141- Divida settings: `settings/base.py`, `settings/local.py`, `settings/production.py`142- Use variáveis de ambiente para segredos (via `python-decouple` ou `django-environ`)143- Nunca comite segredos, arquivos `.env` ou `SECRET_KEY` no controle de versão144145## Convenções de URL146147- Use `path()` em vez de `re_path()` a menos que regex seja realmente necessário148- Sempre defina `app_name` no `urls.py` do app para namespacing149- Sempre use `name=` em cada padrão de URL150- Use `reverse()` ou `{% url %}` — nunca escreva URLs fixas no código151152## Convenções de teste153154- Use `pytest-django` em vez do test runner embutido do Django155- Use `factory_boy` para dados de teste em vez de fixtures156- Nomeie arquivos de teste: `test_<módulo>.py`157- Nomeie funções de teste: `test_<o_que_testa>_<comportamento_esperado>`158- Use `APIClient` para testes de endpoints DRF159160## Ordenação de imports161162Siga os padrões do `isort`:1631. Biblioteca padrão1642. Pacotes de terceiros1653. Imports do Django1664. Imports locais do app167168## Lembretes de segurança169170- Sempre use `{% csrf_token %}` em formulários171- Use `get_object_or_404()` em vez de `.get()` simples nas views172- Valide e sanitize toda entrada do usuário173- Use o ORM do Django — evite SQL bruto a menos que absolutamente necessário174- Defina `AUTH_PASSWORD_VALIDATORS` em produção175- Use configurações `SECURE_*` em produção (HSTS, redirecionamento SSL, etc.)176177---178> Source: [lucasviana78/django-claude-kont](https://github.com/lucasviana78/django-claude-kont) — distributed by [TomeVault](https://tomevault.io).179<!-- tomevault:4.0:skill_md:2026-06-15 -->