Capturar parâmetros de URL em request.GET
Pergunta
Atualmente, estou definindo expressões regulares, a fim de parâmetros de captura em um url, conforme descrito no tutorial. Como faço para acessar os parâmetros da URL como parte do objeto HttpRequest
? Meu HttpRequest.GET
atualmente retorna um objeto QueryDict
vazio.
Eu gostaria de saber como fazer isso sem uma biblioteca para que eu possa ficar a conhecer Django melhor.
Solução
Quando url é semelhante: domain/search/?q=haha
,
Então você teria que usar request.GET.get('q', '')
.
q
é o parâmetro que você quer, e ''
é o valor padrão se q
não foi encontrado.
No entanto, se você está ao invés de apenas configurar seu URLconf
, então a sua captura do regex
são passados ??para a função como argumentos (ou argumentos nomeados).
Tais como:
(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),
Então em seu views.py
você teria
def profile_page(request, username):
# Rest of the method
Outras dicas
Para esclarecer a explicação de camflan, vamos supor que você tem
- o
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
regra - a em solicitação de entrada para
http://domain/user/thaiyoshi/?message=Hi
A regra URL despachante vai pegar partes da URL caminho (aqui "user/thaiyoshi/"
) e passá-las para a função de visão, juntamente com o objeto do pedido.
A seqüência de consulta (aqui message=Hi
) é analisado e parâmetros são armazenados como um QueryDict
em request.GET
. Nenhuma outra correspondência ou transformação para HTTP GET parâmetros é feito.
Esta função de visualização usaria ambas as partes extraídas do caminho de URL e um parâmetro de consulta:
def profile_page(request, username=None):
user = User.objects.get(username=username)
message = request.GET.get('message')
Como uma nota lateral, você vai encontrar o método de solicitação (neste caso "GET"
, e por formulários enviados normalmente "POST"
) em request.method
. Em alguns casos é útil para verificar se ele corresponde ao que você está esperando.
Update: Ao decidir se a usar o caminho URL ou parâmetros de consulta para passar informações, podem ajudar:
- usar o caminho URL para os recursos que identificam exclusivamente, por exemplo,
/blog/post/15/
(não/blog/posts/?id=15
) - parâmetros de consulta uso para mudar a forma como é exibido o recurso, por exemplo,
/blog/post/15/?show_comments=1
ou/blog/posts/2008/?sort_by=date&direction=desc
- para tornar URLs amigáveis ??humanos, evite usar números de ID e usar por exemplo datas, categorias e / ou lesmas:
/blog/post/2008/09/30/django-urls/
Usando GET
request.GET["id"]
Usando POST
request.POST["id"]
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
Eu gostaria de compartilhar uma dica que podem lhe poupar algum tempo.
Se você pretende usar algo como isto em seu arquivo urls.py
:
url(r'^(?P<username>\w+)/$', views.profile_page,),
O que basicamente significa www.example.com/<username>
. Certifique-se de colocá-lo no final de suas entradas de URL, porque caso contrário, ele está propenso a causar conflitos com as entradas de URL que seguem abaixo, ou seja, a aceder a um deles dar-lhe o erro agradável: User matching query does not exist.
Eu apenas experimentou isso sozinho; espero que ajude!
Para situações onde você só tem o objeto request
você pode usar request.parser_context['kwargs']['your_param']
Você tem duas formas comuns de fazer isso no caso de sua aparência url assim:
https://domain/method/?a=x&b=y
v1:
Se a chave específica é obrigatória você pode usar:
key_a = request.GET['a']
Isso irá retornar um valor de a
se a chave existe e uma exceção se não.
v2:
Se suas chaves são opcionais:
request.GET.get('a')
Você pode tentar que, sem qualquer argumento isso não irá falhar.
Então você pode envolvê-lo com try: except:
e regresso HttpResponseBadRequest()
no exemplo.
Esta é uma maneira simples de fazer o seu código menos complexo, sem o uso de Exceções especiais de manipulação.
Isto não é exatamente o que você pediu, mas esse trecho é útil para a gestão query_strings
em templates
.
Eu gostaria de adicionar alguma opção de mim, aqui. Alguém quer saber como caminho definido em urls.py, como
domain/search/?q=CA
para que pudéssemos chamar de consulta.
O fato é que não é necessário definir como rota um em urls.py. O que você precisa conjunto é apenas a rota em urls.py
urlpatterns = [
path('domain/search/', views.CityListView.as_view()),
]
e quando introduzir http: // servername: port / domínio / pesquisa / q = CA . A parte de consulta '? Q = CA' será reservado automaticamente na tabela hash que você pode fazer referência embora
request.GET.get('q', None).
Aqui está um exemplo (views.py)
class CityListView(generics.ListAPIView):
serializer_class = CityNameSerializer
def get_queryset(self):
if self.request.method == 'GET':
queryset = City.objects.all()
state_name = self.request.GET.get('q', None)
if state_name is not None:
queryset = queryset.filter(state__name=state_name)
return queryset
Além disso, quando você escreve string query em Url
http://servername:port/domain/search/?q=CA
Não enrole consulta string entre aspas por exemplo
http://servername:port/domain/search/?q="CA"