es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 archivo urls.py, se definen dos rutas con los nombres viewProduct y BoxView, respectivamente. En la plantilla HTML se crean dos hipervínculos utilizando la etiqueta de plantilla url 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 ruta BoxView. Esto sucede cuando la ruta viewProduct está definida antes de la ruta BoxView en la lista urlpatterns. Si se invierte el orden, el segundo hipervínculo apunta correctamente a la ruta BoxView.

    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 lista urlpatterns 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 lista urlpatterns para que la ruta BoxView esté definida antes que la ruta viewProduct.

    Ejemplo de cambio de orden de rutas en urlpatterns:

    urlspatterns = [
        ...
        path('<slug:boxslug>', BoxView.as_view(), name='BoxView'),
        path('<slug:productslug>', ProductView.as_view(), name='viewProduct'),
        ...
    ]
    

    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.

Comments are closed.