Configuração Detalhada de Campos de Formulários - Django
No Django, é possível personalizar campos de formulários usando diversos parâmetros para ajustar sua aparência e funcionalidade. Contudo, em alguns casos, essas personalizações básicas podem ser insuficientes. Por exemplo, pode ser necessário aplicar estilos CSS específicos ou adicionar texto customizado ao lado de um campo. O Django permite acessar e modificar diretamente a composição de cada campo no template, proporcionando controle mais detalhado.
Acessando Campos de um Formulário no Template
No template, é possível acessar cada campo de um formulário pelo nome, usando a sintaxe form.nome_do_campo
: Nome do campo.form.nome_do_campo.name
: Valor atual do campo.form.nome_do_campo.value
: Texto do label associado ao campo.form.nome_do_campo.label
: ID gerado automaticamente, seguindo o padrãoform.nome_do_campo.id_for_label
.id_nome_do_campo
: ID gerado automaticamente, semelhante ao anterior.form.nome_do_campo.auto_id
: Elementoform.nome_do_campo.label_tag
associado ao campo.<label>
: Texto de ajuda associado ao campo.form.nome_do_campo.help_text
: Lista de erros de validação associados ao campo.form.nome_do_campo.errors
: Classes CSS associadas ao campo.form.nome_do_campo.css_classes
: Gera a marcação HTML para um campo oculto (form.nome_do_campo.as_hidden
).<input type="hidden">
: Retornaform.nome_do_campo.is_hidden
se o campo for oculto, ouTrue
caso contrário.False
: Gera a marcação HTML para um campo de texto (form.nome_do_campo.as_text
).<input type="text">
: Gera a marcação HTML para uma área de texto (form.nome_do_campo.as_textarea
).<textarea>
: Retorna o widget associado ao campo.form.nome_do_campo.as_widget
Por exemplo, para obter o texto do label do campo age
form.age.label
Exemplo de Uso
Considere a seguinte definição de formulário no arquivo forms.py
from django import forms
class UserForm(forms.Form):
name = forms.CharField()
age = forms.IntegerField()
O formulário é passado para o template por meio de uma view no arquivo views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import UserForm
def index(request):
userform = UserForm()
if request.method == "POST":
userform = UserForm(request.POST)
if userform.is_valid():
name = userform.cleaned_data["name"]
return HttpResponse(f"<h2>Hello, {name}</h2>")
return render(request, "index.html", {"form": userform})
No template index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Django Forms</title>
</head>
<body>
<form method="POST" novalidate>
{% csrf_token %}
<div>
{% for field in form %}
<div class="form-group">
{{ field.label_tag }}
<div>{{ field }}</div>
<div class="error">{{ field.errors }}</div>
</div>
{% endfor %}
</div>
<p><input type="submit" value="Send"></p>
</form>
</body>
</html>
No exemplo acima, a estrutura {% for field in form %}
field.errors
A imagem a seguir ilustra o formulário com erros retornados após o envio incorreto de dados:

Tratando Vários Erros em um Campo
Se um único campo contiver vários erros de validação, é possível exibi-los individualmente usando uma estrutura de repetição:
{% for error in field.errors %}
<div class="alert alert-danger">{{ error }}</div>
{% endfor %}