urls - ¿Cómo obtener el nombre de la url actual usando Django?
django urls (7)
A partir de Django 1.5, se puede acceder desde el objeto de solicitud
current_url = request.resolver_match.url_name
https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match
Tengo que construir una URL dinámicamente de acuerdo con la URL actual. Usar la etiqueta {% url %}
es la forma más fácil de hacerlo, pero necesito el nombre de la url actual para generar la nueva de forma dinámica.
¿Cómo puedo obtener el nombre de la url adjunta al urlconf que conduce a la vista actual?
EDITAR: Sé que puedo hacer manualmente la url usando get_absolute_url
pero prefiero evitarlo ya que es parte de una conferencia y me gustaría mostrar una sola forma de construir urls.
Los estudiantes saben cómo usar {% url %}
. Ellos saben que enfrentan un problema cuando tienen que generar una URL más completa basada en la actual. La forma más fácil es usar {% url %}
nuevamente, con algunas variaciones. Como hemos nombrado la url, necesitamos saber cómo obtener el nombre de la url que llamó a la vista actual.
EDIT 2: otro caso de uso es mostrar partes de la plantilla base de manera diferente según la plantilla base. Hay otras maneras de hacerlo (usando CSS y {% block%}, pero en algún momento es bueno poder eliminar la etiqueta de la entrada de menú de base.html si el nombre de vista coincide con el enlace.
Aclaración de la pregunta: "En una vista, ¿cómo se obtiene el nombre de un urlpattern que lo señala, suponiendo que exista exactamente un tal urlpattern".
Esto puede ser deseable por las razones indicadas: desde dentro de la vista, queremos una forma DRY de obtener una url para la misma vista (no queremos tener que conocer nuestro propio nombre de urlpattern).
Respuesta corta: no es lo suficientemente simple para enseñar a tu clase, pero podría ser algo divertido para ti en una hora o dos y vomitar en GitHub.
Si realmente quisiera hacer esto, tendría que subclasificar RegexURLResolver y modificar el método de resolución para devolver el patrón coincidente (del que puede obtener el nombre del patrón) en lugar de los pares de vista y palabra clave / valor. http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142
A continuación, podría crear un decorador o quizás un middleware más apropiado que use esta subclase para obtener el nombre del patrón y almacenar ese valor en alguna parte de la solicitud para que las vistas puedan usarlo.
Si realmente quieres hacer eso y te encuentras con algún problema, avísame y probablemente pueda ayudarte.
Para su clase, simplemente les pediría que codifiquen 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 esto, más desalentaría tratar de obtener un nombre de patrón url en una vista. Los parámetros de urlpattern son bastante independientes de los parámetros de la vista a la que apuntan. Si desea apuntar a una determinada url, necesita saber cómo funciona el urlpattern, no solo cómo funciona la vista. Si necesita saber cómo funciona el urlpattern, también debería saber el nombre del urlpattern.
Esto se puede lograr a través de:
request.resolver_match.url_name
Django> 1.8
No está claro por su pregunta, pero http://docs.djangoproject.com/en/dev/topics/http/urls/ probablemente proporcionará una explicación de lo que busca.
Especialmente útil para observar cómo procesa Django las solicitudes:
Cuando un usuario solicita una página desde su sitio con Django, este es el algoritmo que sigue el sistema para determinar qué código Python ejecutar:
- Django determina el módulo raíz URLconf para usar. Normalmente, este es el valor de la configuración ROOT_URLCONF, pero si el objeto HttpRequest entrante tiene un atributo llamado urlconf (establecido por el proceso de solicitud de middleware), su valor se usará en lugar de la configuración ROOT_URLCONF.
- Django carga ese módulo de Python y busca la variable urlpatterns. Esta debería ser una lista de Python, en el formato devuelto por la función django.conf.urls.defaults.patterns ().
- Django recorre cada patrón de URL, en orden, y se detiene en el primero que coincide con la URL solicitada.
- Una vez que una de las expresiones regulares coincide, Django importa y llama a la vista dada, que es una función simple de Python. La vista obtiene una HttpRequest como su primer argumento y cualquier valor capturado en la expresión regular como argumentos restantes.
Si está justo después de la ruta completa, puede intentar:
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
Espero que eso ayude: indica cómo usar el módulo URLconf, y con suerte lo ayudará a orientarlo en la dirección correcta.
No sé cuánto tiempo esta característica ha sido parte de Django, pero como muestra el siguiente 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 eso en cada plantilla, escribir una solicitud de plantilla puede ser apropiado.
Editar: APLICANDO NUEVA ACTUALIZACIÓN DE DJANGO
Siguiendo la actualización actual de Django:
Django 1.10 ( link )
La importación desde el módulo
django.core.urlresolvers
está en desuso en favor de su nueva ubicación,django.urls
Django 2.0 ( link )
El módulo
django.core.urlresolvers
se elimina a favor de su nueva ubicación,django.urls
.
Por lo tanto, la forma correcta de hacerlo es así:
from django.urls import resolve
current_url = resolve(request.path_info).url_name
Para aquellos que nombran sus patrones de URL, es posible que le interese el nombre de la url en el espacio de nombre de la solicitud. En este caso, Django lo llamó view_name
en view_name
lugar.
request.resolver_match.view_name
# return: <namespace>:<url name>