Tengo que crear una URL de forma dinámica de acuerdo con la URL actual. Usar la {% url %}
etiqueta 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 adjuntar el nombre de la URL a la urlconf que conduce a la vista actual?
EDITAR: Sé que puedo crear manualmente la URL usando, get_absolute_url
pero prefiero evitarlo ya que es parte de una conferencia y me gustaría demostrar solo una forma de crear URL.
Los alumnos saben cómo utilizar {% url %}
. Se sabe que se enfrentan a un problema cuando tienen que generar una URL más completa basada en la actual. La forma más sencilla es {% url %}
volver a utilizarla , con algunas variaciones. Dado que hemos nombrado url, necesitamos saber cómo obtener el nombre de la URL que llamó a la vista actual.
EDICIÓN 2: otro caso de uso es mostrar partes de la plantilla base de manera diferente según la plantilla base. Hay otras formas de hacerlo (usando CSS y {% block%}, pero a veces es bueno poder eliminar la etiqueta de la entrada del menú de base.html si el nombre de la vista coincide con el enlace.
fuente
{{ request.get_full_path }}
Respuestas:
No sé cuánto tiempo ha sido esta característica 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 LA NUEVA ACTUALIZACIÓN DE DJANGO
Siguiendo la actualización actual de Django:
Django 1.10 ( enlace )
Django 2.0 ( enlace )
Por lo tanto, la forma correcta de hacerlo es así:
from django.urls import resolve current_url = resolve(request.path_info).url_name
fuente
resolve()
no se puede resolver si le pasa una cadena de consulta y simplemente genera un 404.get_full_path()
devuelve la ruta y la cadena de consulta. Necesitará usarresolve(request.path_info)
.current
sucede si no es la URL la que tiene que resolverse, sino, por ejemplo, la URL a la que va a redirigir el usuario? ¿Cuál es una forma más genérica de lograr esto? La respuesta de Conley Owens tiene una pista, pero prefiero no reinventar la rueda si dicha rueda ya existe en Django bajo el capó.A partir de Django 1.5, se puede acceder a esto 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
fuente
AttributeError: 'WSGIRequest' object has no attribute 'resolver_match'
.view_name
si necesita el espacio de nombresPara aquellos que usan espacios de nombres en sus patrones de URL, entonces puede estar interesado en el nombre de URL de espacios de nombres de la solicitud. En este caso, Django lo llamó en su
view_name
lugar.request.resolver_match.view_name # return: <namespace>:<url name>
fuente
urls.py
entonces @ dariusz-niespodziany es inmediatamentereverse
-able. Pero si usa un espacio de nombres, entoncesresolver_match.url_name
no es directamentereverse
-able. Por lo tanto, debe agregar el espacio de nombres usted mismo. Entonces, en lugar de hacerlo usted mismo, Django ya configuró el.view_name
al inicializar.Esto se puede lograr mediante:
request.resolver_match.url_name
Django> 1.8
fuente
Aclaración de la pregunta: "En una vista, ¿cómo se obtiene el nombre de un patrón de URL que apunta a él, asumiendo que existe exactamente uno de esos patrones de URL"?
Esto puede ser deseable por las razones indicadas: desde dentro de la vista, queremos una forma SECA de obtener una URL para la misma vista (no queremos tener que conocer nuestro propio nombre de patrón de URL).
Respuesta corta: No es lo suficientemente simple como para impartir tu clase, pero podría ser algo divertido para ti hacer en una hora o dos y vomitar en GitHub.
Si realmente quisiera hacer esto, tendría que crear una subclase de RegexURLResolver y modificar el método de resolución para devolver el patrón coincidente (del cual 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
Luego, 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 algún lugar de la solicitud para que las vistas puedan usarlo.
Si realmente quiere hacer eso y tiene algún problema, hágamelo saber y probablemente pueda ayudar.
Para su clase, simplemente les pediría que codificaran 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 intentar obtener un nombre de patrón de 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 URL determinada, debe saber cómo funciona el patrón de URL, no solo cómo funciona la vista. Si necesita saber cómo funciona el patrón de URL, es posible que también tenga que saber el nombre del patrón de URL.
fuente
Solo inténtalo
request.path
. Eso obtendrá la ruta actual que se solicita.fuente
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
fuente
No está claro a partir de tu pregunta, pero http://docs.djangoproject.com/en/dev/topics/http/urls/ probablemente te dará una explicación de lo que buscas.
Especialmente útil para notar cómo Django procesa las solicitudes:
Cuando un usuario solicita una página de su sitio con tecnología Django, este es el algoritmo que sigue el sistema para determinar qué código Python ejecutar:
Si solo busca la ruta completa, puede probar:
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, le ayudará a orientarlo en la dirección correcta.
fuente