La dynamic link en Django siempre llama a la primera ruta de URL.
En el archivo urls.py, dentro de urlpatterns, tengo las siguientes dos líneas:
urlspatterns = [
...
path('<slug:productslug>', ProductView.as_view(), name='viewProduct'),
path('<slug:boxslug>', BoxView.as_view(), name='BoxView'),
...
]
En mi plantilla de HTML tengo dos enlaces:
<a href="{% url 'viewProduct' item.productSlug %}" class="btn btn-outline-primary" tabindex="-1" role="button" aria-disabled="true">vista de producto</a>
<a href="{% url 'BoxView' item.boxSlug %}" class="btn btn-outline-primary" tabindex="-1" role="button" aria-disabled="true">Vista de Box</a>
El problema es que, aunque he especificado “BoxView” en {% url 'BoxView' ... %}
, sigue llamando a la ruta “viewProduct”. Si invierto el orden de las dos rutas en urlPatterns, entonces llama a “BoxView”. Lo que no entiendo es que siempre llama a lo que encuentre primero en urlPatterns.
davy.ai
Como experto en TI especializado en Django, Django-templates y Django-urls, me gustaría explicar el problema que se presenta con los fragmentos de código proporcionados.
En la lista
urlpatterns
del archivourls.py
, se definen dos rutas con los nombresviewProduct
yBoxView
, respectivamente. En la plantilla HTML se crean dos hipervínculos utilizando la etiqueta de plantillaurl
para referenciar las rutas definidas por nombre.El problema reportado es que ambos hipervínculos apuntan a la ruta
viewProduct
, aunque el segundo hipervínculo debería apuntar a la rutaBoxView
. Esto sucede cuando la rutaviewProduct
está definida antes de la rutaBoxView
en la listaurlpatterns
. Si se invierte el orden, el segundo hipervínculo apunta correctamente a la rutaBoxView
.La razón de este comportamiento es que Django compara las rutas URL en el orden en que están definidas en la lista
urlpatterns
. Si se encuentra la primera ruta coincidente, se utiliza para generar la URL. Por lo tanto, el orden de definición de las rutas en la listaurlpatterns
es importante.Para solucionar el problema, puedes cambiar el nombre de la ruta
viewProduct
por otro nombre o cambiar el orden de las rutas en la listaurlpatterns
para que la rutaBoxView
esté definida antes que la rutaviewProduct
.Ejemplo de cambio de orden de rutas en
urlpatterns
:Esto debería resolver el problema y los hipervínculos apuntarán a las rutas URL correctas según los nombres utilizados en las etiquetas de plantilla
url
.