Pregunta

Tengo que construir una url de forma dinámica de acuerdo a la url actual.El uso de la {% url %} la etiqueta es la manera más fácil de hacerlo, pero necesito el actual nombre de la dirección url para generar una nueva dinámica.

¿Cómo puedo obtener el nombre de la url adjunta a la urlconf que conduce a la visión actual?

EDITAR :Sé que puedo manualmente artesanal de la url mediante get_absolute_url pero prefiero evitarlo, ya que es parte de una conferencia y me gustaría mostrar sólo una forma de construir la url.

Los estudiantes saben cómo utilizar {% url %}.Se sabe que se enfrenta a un problema cuando tienen que generar una más completa de la url sobre la base de la actual.La forma más fácil es usar {% url %} de nuevo, con algunas variaciones.Ya que hemos nombrado a la url, necesitamos saber cómo obtener el nombre de la url que llama a la vista actual.

EDIT 2:otro caso de uso es para mostrar partes de la base de la plantilla différently de acuerdo a la base de la plantilla.Hay otras maneras de hacerlo (mediante el uso de CSS y {% block %}, pero en algún momento es bueno sólo para ser capaz de quitar la etiqueta de la entrada de menú de base.html si el viewname coincidir con el enlace.

¿Fue útil?

Solución

No sé cuánto tiempo esta característica ha sido parte de Django, pero como el siguiente muestra el artículo , se puede lograr de la siguiente manera en la vista:

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

Si necesita que en cada plantilla, escribiendo una solicitud plantilla puede ser apropiado.

Editar: la aplicación de nuevas DJANGO ACTUALIZACIÓN

Después de la actualización actual de Django:

Django 1.10 ( enlace )

  

Importar desde el módulo está en desuso en django.core.urlresolvers   a favor de su nueva ubicación, django.urls

Django 2.0 ( enlace )

  

El módulo django.core.urlresolvers se elimina en favor de su nueva   ubicación, django.urls.

Por lo tanto, la forma correcta de hacerlo es la siguiente:

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

Otros consejos

A partir de Django 1.5, esto se puede acceder desde el objeto de solicitud

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/ dev / ref / solicitud-respuesta / # django.http.HttpRequest.resolver_match

Para los que los espacios de nombres de sus patrones de URL, entonces usted puede estar interesado en el nombre de espacio de nombres URL de la solicitud. En este caso, Django llamó view_name lugar.

request.resolver_match.view_name

# return: <namespace>:<url name>

Esto puede lograrse a través de:

request.resolver_match.url_name

Django> 1.8

Aclaración de la pregunta: "En una vista, ¿cómo se consigue el nombre de un URLPATTERN que apunta a que, asumiendo que no es exactamente un ejemplo URLPATTERN"

Esto puede ser deseable por las razones indicadas:. Desde la vista, queremos una vía seca de conseguir una URL a la misma vista (que no quiere tener que conocer nuestro propio nombre URLPATTERN)

Respuesta corta:. No es realmente lo suficientemente sencilla para enseñar a su clase, pero que podría ser una cosa de la diversión para que usted pueda hacer en una hora o dos y vomita en GitHub

Si realmente quería hacer esto, se tendría que subclase RegexURLResolver y modificar el método de determinación de volver patrón emparejado (a partir del cual se puede obtener el nombre del patrón) en lugar de la vista y la palabra clave / valor. http://code.djangoproject.com/browser/ django / trunk / django / core / urlresolvers.py # L142

A continuación, podría crear un decorador o tal vez más apropiadamente middleware que utiliza esta subclase para obtener el nombre del patrón y almacenar ese valor en algún lugar del pedido, por lo que los puntos de vista puede utilizarlo.

Si usted realmente quiere hacer eso y se ejecuta a través de algunos problemas, hágamelo saber y es probable que pueda ayuda.

Para su clase, sólo tendría que codificar el nombre del patrón en la vista o plantilla. Creo que esta es la forma aceptable de hacerlo.

Actualización: Cuanto más pienso en ello, más me desanimaría a tratar de conseguir un nombre URLPATTERN en una vista. urlPattern parámetros son bastante independiente de los parámetros de la vista que apuntan. Si desea apuntar a una determinada URL, lo que necesita saber cómo funciona el patrón URL, no sólo cómo los trabajos de vista. Si lo que necesita saber cómo funciona el patrón URL, puede ser que también tiene que saber el nombre de la URLPATTERN.

Es un poco confuso de su pregunta, pero http://docs.djangoproject.com/en/dev/topics/http/urls/ es probable que dar una explicación a lo que está después.

Especialmente útil observar cómo Django procesos de solicitudes:

Cuando un usuario solicita una página de tu Django-powered sitio, este es el algoritmo que el sistema de la siguiente manera para determinar que el código de Python para ejecutar:

  1. Django determina la raíz URLconf módulo a utilizar.Normalmente, este es el valor de la ROOT_URLCONF de ajuste, pero si el entrante objeto HttpRequest tiene un atributo llamado urlconf (establecida por el middleware de procesamiento de la solicitud), su valor será usado en lugar de la ROOT_URLCONF configuración.
  2. Django cargas con un módulo de Python y busca la variable urlpatterns.Esta debe ser una lista de Python, en el formato devuelto por la función de django.conf.direcciones url.los valores predeterminados.patrones().
  3. Django ejecuta a través de cada patrón de URL, en orden, y se detiene en la primera, que coincide con la dirección URL solicitada.
  4. Una vez que una de las expresiones regulares partidos, Django importaciones y llama a la afirmación, que es una simple función de Python.La vista se le pasa un objeto HttpRequest como primer argumento y los valores capturados en el regex como argumentos restantes.

Si usted es justo después de la ruta de acceso completa, usted puede intentar:

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path

Espero que le ayuda - se indica cómo utilizar la URLconf módulo, y se espera que ayudarle a usted en la dirección correcta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top