Pergunta

Eu tenho que construir um URL dinamicamente de acordo com o URL atual. Usando o {% url %} A tag é a maneira mais fácil de fazê -lo, mas preciso do nome atual do URL para gerar o novo dinamicamente.

Como posso colocar o nome do URL anexado ao URLConf que leva à visualização atual?

EDIT: Eu sei que posso manualmente manualmente o URL usando get_absolute_url Mas prefiro evitá -lo, pois faz parte de uma palestra e gostaria de demonstrar apenas uma maneira de construir URLs.

Os alunos sabem como usar {% url %}. Eles sabem que enfrentam um problema quando precisam gerar um URL mais completo com base no atual. A maneira mais fácil é usar {% url %} Novamente, com algumas variações. Desde que nomeamos URL, Precisamos saber como obter o nome do URL que chamou de visualização atual.

EDIT 2: Outro caso de uso é exibir partes do modelo base diferenciado de acordo com o modelo base. Existem outras maneiras de fazê -lo (usando CSS e { % Block %}, mas às vezes é bom poder remover a etiqueta da entrada do menu do base.html se o viewName corresponder ao link.

Foi útil?

Solução

Não sei quanto tempo esse recurso faz parte do Django, mas como o Artigo a seguir mostra, ele pode ser alcançado da seguinte maneira na vista:

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

Se você precisar disso em todos os modelos, a gravação de uma solicitação de modelo pode ser apropriada.

Editar: Aplicando uma nova atualização do Django

Após a atualização atual do Django:

Django 1.10 (link)

Importando do django.core.urlresolvers O módulo está preguiçoso em favor de seu novo local, django.urls

Django 2.0 (link)

o django.core.urlresolvers O módulo é removido em favor de seu novo local, django.urls.

Assim, a maneira certa de fazer é assim:

from django.urls import resolve
current_url = resolve(request.path_info).url_name

Outras dicas

A partir do Django 1.5, isso pode ser acessado a partir do objeto de solicitação

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/dev/ref/request-rosponse/#django.http.httprequest.resolver_match

Para aqueles que nomeiam seus padrões de URL, você pode estar interessado no nome da URL do nome do nome da solicitação. Nesse caso, Django chamou view_name em vez de.

request.resolver_match.view_name

# return: <namespace>:<url name>

Isso pode ser alcançado via:

request.resolver_match.url_name

Django> 1.8

Esclarecimento da pergunta: "Em uma visão, como você obtém o nome de um urlpattern que aponta para ela, assumindo que existe exatamente um desses urlpattern".

Isso pode ser desejável pelos motivos declarados: De dentro da vista, queremos uma maneira seca de obter um URL para a mesma visão (não queremos conhecer nosso próprio nome de urlpattern).

Resposta curta: não é realmente simples o suficiente para dar sua aula, mas pode ser uma coisa divertida para você fazer em uma ou duas horas e vomitar no Github.

Se você realmente quis fazer isso, teria que subclasse regexurlResolver e modificar o método de resolução para retornar o padrão correspondente (do qual você pode obter o nome do padrão) em vez da visualização e dos pares de palavras -chave/valores.http://code.djangoproject.com/browsher/django/trunk/django/core/urlresolvers.py#l142

Você pode criar um decorador ou talvez um middleware mais apropriado que use essa subclasse para obter o nome do padrão e armazenar esse valor em algum lugar da solicitação para que as visualizações possam usá -lo.

Se você realmente quer fazer isso e se deparar com alguns problemas, me avise e provavelmente posso ajudar.

Para sua aula, eu os faria apenas com codificação no nome do padrão na visualização ou modelo. Eu acredito que essa é a maneira aceitável de fazer isso.

Atualizar:Quanto mais penso sobre isso, mais desencorajaria a tentativa de obter um nome de urlpattern em uma visão. Os parâmetros URLPattern são bastante independentes dos parâmetros da visão que apontam. Se você deseja apontar para um determinado URL, precisa saber como o URLPattern funciona, não apenas como a exibição funciona. Se você precisar saber como o UrlPattern funciona, pode muito bem saber o nome do urlpattern.

Está um pouco claro da sua pergunta, mas http://docs.djangoproject.com/en/dev/topics/http/urls/ Provavelmente fornecerá uma explicação para o que você procura.

Especialmente útil para observar como o Django processa as solicitações:

Quando um usuário solicita uma página do seu site movido a Django, este é o algoritmo que o sistema segue para determinar qual código Python a ser executado:

  1. O Django determina o módulo raiz URLCONF a ser usado. Normalmente, esse é o valor da configuração root_urlconf, mas se o objeto HttPrequest recebido tiver um atributo chamado URLConf (definido pelo processamento de solicitação de middleware), seu valor será usado no lugar da configuração root_urlconf.
  2. O Django carrega esse módulo Python e procura os urlpatterns variáveis. Esta deve ser uma lista Python, no formato retornado pela função django.conf.urls.defaults.patterns ().
  3. O Django atravessa cada padrão de URL, em ordem e para no primeiro que corresponde ao URL solicitado.
  4. Uma vez que um dos regexes corresponde, o Django importa e chama a visão fornecida, que é uma função simples do Python. A visão é aprovada em uma httprequest como seu primeiro argumento e quaisquer valores capturados no Regex como argumentos restantes.

Se você está logo após o caminho completo, pode tentar:

http://docs.djangoproject.com/en/dev/ref/request-rosponse/#django.http.httprequest.get_full_path

Espero que ajude - indica como usar o módulo URLConf e, esperançosamente, ajudará a apontar na direção certa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top