Parametros de Views no Django
No Django, as funções de visualização(views) podem receber parâmetros adicionais além do objeto HttpRequest
. Esses parâmetros são definidos na URL da rota e são capturados pelo Django para repassá-los à função de visualização.
Por exemplo, na URL:
http://127.0.0.1:8000/index/Tom/38/
Os segmentos Tom
e 38
representam parâmetros que podem ser passados para uma função de view correspondente.
Definição de Parâmetros com a Função path
No arquivo views.py
, podem ser definidas funções que aceitam parâmetros. Por exemplo:
from django.http import HttpResponse
def index(request):
return HttpResponse("<h2>Página Principal</h2>")
def user(request, name):
return HttpResponse(f"<h2>Nome: {name}</h2>")
Na função user
, o parâmetro name
recebe o valor correspondente da URL. Ele pode ser manipulado internamente na função como qualquer outro argumento.
No arquivo urls.py
, o seguinte código pode ser usado para configurar as rotas:
from django.urls import path
from hello import views
urlpatterns = [
path("", views.index),
path("user/<str:name>", views.user),
]
O parâmetro name
na rota é especificado entre os delimitadores < >
, no formato <tipo:nome>
. Aqui, o tipo str
indica que o valor será tratado como uma string. Outros especificadores disponíveis no Django incluem:
str
: qualquer string, exceto/
. É o valor padrão.int
: números inteiros positivos.slug
: combina caracteres alfanuméricos ASCII, hífens e underscores.uuid
: corresponde a um UUID, como075194d3-6885-417e-a8a8-6c931e272f00
.path
: aceita strings que podem incluir o caractere/
.
Os nomes e quantidades dos parâmetros na rota devem corresponder aos argumentos da função que processará a solicitação.
A função user
pode ser acessada pela URL http://127.0.0.1:8000/user/Tom
. Nesse caso, o valor Tom
será atribuído ao parâmetro name
.
Definição de Múltiplos Parâmetros
Se for necessário incluir um segundo parâmetro, como age
, no arquivo views.py
, a função pode ser alterada para:
def user(request, name, age):
return HttpResponse(f"<h2>Nome: {name} Idade: {age}</h2>")
No arquivo urls.py
, a rota deve incluir os dois parâmetros:
from django.urls import path
from hello import views
urlpatterns = [
path("", views.index),
path("user/<str:name>/<int:age>", views.user),
]
Neste exemplo, o valor de age
será tratado como um inteiro devido ao especificador int
. A função user
pode ser acessada pela URL http://127.0.0.1:8000/user/Tom/38
, onde Tom
e 38
serão atribuídos
, respectivamente, aos parâmetros name
e age
.
Dessa forma, URLs como http://127.0.0.1:8000/user
ou http://127.0.0.1:8000/user/Tom
serão tratadas corretamente.
Valores Padrão para Parâmetros
Quando valores para os parâmetros não são fornecidos na URL, ocorre um erro 404, pois a solicitação não corresponde a nenhuma rota definida. Para evitar isso, valores padrão podem ser atribuídos aos parâmetros na função de view:
def user(request, name="Indefinido", age=0):
return HttpResponse(f"<h2>Nome: {name} Idade: {age}</h2>")
Neste caso, se o valor de name
não for fornecido, ele será definido como "Indefinido"
, e age
será definido como 0
.
No arquivo urls.py
, é necessário definir rotas adicionais para tratar URLs com diferentes combinações de parâmetros:
from django.urls import path
from hello import views
urlpatterns = [
path("", views.index),
path("user", views.user),
path("user/<str:name>", views.user),
path("user/<str:name>/<int:age>", views.user),
]
Definição de Parâmetros com a Função re_path
O Django também permite a utilização de expressões regulares para definir rotas e parâmetros, utilizando a função re_path
. No arquivo views.py
, a função de view permanece a mesma:
def user(request, name, age):
return HttpResponse(f"<h2>Nome: {name} Idade: {age}</h2>")
No arquivo urls.py
, a configuração da rota pode ser feita com re_path
:
from django.urls import path, re_path
from hello import views
urlpatterns = [
path("", views.index),
re_path(r"^user/(?P<name>\D+)/(?P<age>\d+)", views.user),
]
No padrão (?P<nome_do_parametro>expressão_regular)
, o nome do parâmetro é especificado entre < >
, seguido por uma expressão regular. No exemplo acima, name
aceita apenas caracteres alfabéticos (\D+
), enquanto age
aceita apenas dígitos (\d+
).
Rotas com valores padrão para parâmetros também podem ser definidas com re_path
. A função no arquivo views.py
pode ser ajustada para:
def user(request, name="Indefinido", age=0):
return HttpResponse(f"<h2>Nome: {name} Idade: {age}</h2>")
No arquivo urls.py
, rotas adicionais precisam ser configuradas para lidar com combinações de parâmetros ausentes:
urlpatterns = [
path("", views.index),
re_path(r"^user/(?P<name>\D+)/(?P<age>\d+)", views.user),
re_path(r"^user/(?P<name>\D+)", views.user),
re_path(r"^user", views.user),
]
É importante garantir que as rotas mais específicas sejam declaradas antes das mais genéricas. Isso evita conflitos no roteamento e assegura que os valores sejam processados corretamente de acordo com o formato da URL.
Documentação oficial: