Enviando Dados de Formulários no Django
Uma maneira comum de enviar dados para o servidor é utilizando formulários HTML, geralmente em requisições do tipo POST. No Django, existem dois métodos principais para lidar com formulários:
- Trabalhar diretamente com formulários HTML padrão.
- Utilizar o suporte especializado do Django para formulários, que pode simplificar o trabalho com dados em algumas situações.
Este artigo aborda o primeiro método, mostrando como receber dados enviados por formulários HTML padrão.
Os dados de formulários são frequentemente enviados para o servidor em requisições POST. Para acessar esses dados, o Django disponibiliza o atributo POST
na classe HttpRequest
. Por exemplo, considere o seguinte template index.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Formulário de Usuário</title>
</head>
<body>
<h2>Formulário de Usuário</h2>
<form method="post" action="postuser/">
{% csrf_token %}
<p>
Nome:<br />
<input name="name" />
</p>
<p>
Idade:<br />
<input name="age" type="number" />
</p>
<input type="submit" value="Enviar" />
</form>
</body>
</html>
Aqui, um formulário foi definido para entrada de dados do usuário, enviando informações em uma requisição POST para o endpoint xq, especificado no atributo xq. O formulário inclui dois campos de entrada: o primeiro para o nome do usuário e o segundo para a idade.
A tag {% csrf_token %}
adiciona um token CSRF ao formulário para proteger a aplicação contra ataques CSRF. O Django exige a presença desse token em requisições POST para validar a origem dos dados enviados.
No arquivo views.py
, as funções para processar o envio e receber os dados do formulário podem ser definidas da seguinte maneira:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return render(request, "index.html")
def postuser(request):
name = request.POST.get("name", "Indefinido")
age = request.POST.get("age", 1)
return HttpResponse(f"Nome: {name} | Idade: {age}")
A função index
retorna o template contendo o formulário. Já a função postuser processa os dados enviados. O dicionário request.POST
contém os dados submetidos, permitindo o acesso a cada campo pelo nome especificado no atributo name
no formulário. Caso um campo não esteja presente, valores padrão são retornados.
Por exemplo, no código:
<input name="age" type="number" />
O nome do campo é "age"
. Assim, o valor submetido pode ser acessado com request.POST.get("age", 1)
. Se o valor estiver ausente, o retorno será o valor padrão especificado (neste caso, 1
).
No arquivo urls.py
, as funções podem ser vinculadas às rotas como segue:
from django.urls import path
from hello import views
urlpatterns = [
path("", views.index),
path("postuser/", views.postuser),
]
Após o envio do formulário, os dados processados são retornados ao cliente.
Exemplo de formulário HTML para envio de dados:
Dados exibidos no navegador após envio do formulário:
Manipulação de Arrays
Para enviar arrays de dados em um formulário HTML, consideramos o seguinte exemplo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Formulário de Usuário</title>
</head>
<body>
<h2>Formulário de Usuário</h2>
<form method="post" action="postuser/">
{% csrf_token %}
<p>
Nome:<br />
<input name="name" />
</p>
<p>
Idade:<br />
<input name="age" type="number" />
</p>
<p>
Linguagens:<br />
<input name="languages" /><br />
<input name="languages" /><br />
<input name="languages" /><br />
</p>
<input type="submit" value="Enviar" />
</form>
</body>
</html>
Neste caso, foram adicionados três campos de entrada para linguagens de programação. O atributo name
é o mesmo para todos os campos, permitindo que os valores sejam acessados como um array no lado do servidor.
A função postuser
pode ser ajustada para processar arrays:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return render(request, "index.html")
def postuser(request):
name = request.POST.get("name", "Indefinido")
age = request.POST.get("age", 1)
langs = request.POST.getlist("languages", ["python"])
return HttpResponse(f"""
<div>Nome: {name} | Idade: {age}</div>
<div>Linguagens: {langs}</div>
""")
A função getlist()
permite acessar listas de valores associados a um mesmo nome no formulário. Caso não haja dados para a chave especificada, é retornado um valor padrão (neste caso, ["python"]
).
Exemplo de formulário HTML para envio de dados:
Dados exibidos no navegador após envio do formulário:
O mesmo conceito pode ser aplicado a campos como select
, que suportam seleção múltipla:
<select multiple name="languages">
<option>Python</option>
<option>JavaScript</option>
<option>C++</option>
<option>Java</option>
</select>
Documentação oficial: