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.

Foi útil?

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"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top