Capturar parâmetros de URL em request.GET

votos
332

Atualmente, estou definindo expressões regulares, a fim de capturar os parâmetros de URL, conforme descrito no tutorial. Como faço para acessar os parâmetros da URL como parte do HttpRequestobjeto? Meu HttpRequest.GETatualmente retorna um vazio QueryDictobjeto.

Eu gostaria de saber como fazer isso sem uma biblioteca para que eu possa ficar a conhecer Django melhor.

Publicado 29/09/2008 em 21:29
fonte usuário
Em outras línguas...                            


9 respostas

votos
500

Quando url é semelhante:domain/search/?q=haha Então você usaria request.GET.get('q', '').

qé o parâmetro que você quer, e ''é o valor padrão se qnão for encontrado.

No entanto, se você estiver em vez apenas de configurar o seuURLconf , então a sua captura do regexsão passados para a função como argumentos (ou argumentos nomeados).

Tal como:

(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),

Então em seu views.pyvocê teria

def profile_page(request, username):
    # Rest of the method
Respondeu 29/09/2008 em 21:31
fonte usuário

votos
274

Para esclarecer a explicação de camflan, vamos supor que você tem

  • a regra url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • um no pedido de entrada para http://domain/user/thaiyoshi/?message=Hi

A regra despachante URL vai pegar partes do URL caminho (aqui "user/thaiyoshi/") e passá-las para a função de visão, juntamente com o objeto do pedido.

A string de consulta (aqui message=Hi) é analisado e parâmetros são armazenados como QueryDictem request.GET. Nenhuma outra correspondência ou de processamento de parâmetros HTTP GET é 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 geralmente "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 recursos de identificação única, por exemplo /blog/post/15/(não /blog/posts/?id=15)
  • usar parâmetros de consulta para mudar a forma como o recurso for apresentado, por exemplo, /blog/post/15/?show_comments=1ou/blog/posts/2008/?sort_by=date&direction=desc
  • para fazer URLs amigáveis ​​humanos, evitar o uso de números de ID e usar por exemplo, datas, categorias e / ou lesmas: /blog/post/2008/09/30/django-urls/
Respondeu 01/10/2008 em 13:11
fonte usuário

votos
37

usando GET

request.GET["id"]

usando POST

request.POST["id"]
Respondeu 21/01/2015 em 08:08
fonte usuário

votos
18
def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..
Respondeu 18/11/2010 em 19:40
fonte usuário

votos
12

Eu gostaria de compartilhar uma dica que podem lhe poupar algum tempo.
Se você pretende usar algo como isto em seu urls.pyarquivo:

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 acessando um deles vai dar-lhe o erro agradável: User matching query does not exist.

Eu apenas experimentou isso sozinho; espero que ajude!

Respondeu 05/02/2013 em 03:05
fonte usuário

votos
8

Isso não é exatamente o que você pediu, mas esse trecho é útil para a gestão query_stringsem templates.

Respondeu 30/09/2008 em 10:19
fonte usuário

votos
5

Para situações onde você só tem o requestobjeto que você pode usarrequest.parser_context['kwargs']['your_param']

Respondeu 05/05/2017 em 13:54
fonte usuário

votos
4

Você tem duas maneiras comuns de fazer isso no caso do seu url parece que:

https://domain/method/?a=x&b=y

v1:

Se chave específica é obrigatória você pode usar:

key_a = request.GET['a']

Isso irá retornar um valor de ase existe chave 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 voltar 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.

Respondeu 04/10/2017 em 12:05
fonte usuário

votos
2

Eu gostaria de adicionar alguma opção de mim, aqui. Alguém quer saber como definir o caminho em urls.py, como

domain/search/?q=CA

para que pudéssemos chamar de consulta.

O fato é que não é necessário estabelecer uma tal rota em urls.py. O que você precisa definir é 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 de consulta em Url

http://servername:port/domain/search/?q=CA

Não enrole string de consulta entre aspas por exemplo,

http://servername:port/domain/search/?q="CA"
Respondeu 06/06/2018 em 07:20
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more