Tengo varias rutas en mi archivo urls.py para communities de aplicaciones. Aquí están los dos que están causando problemas.
path('posts/<str:username>/<slug:slug>',communities_views.viewPostDetail,name="post_detail")
path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment")
Por alguna razón, Django parece confundirse con el orden de estos dos caminos. Cuando está en el orden que se muestra, Django reconoce que delete_comment es una ruta (lo que significa que en las plantillas que usan algo como communities:delete_comment no arroja un error al generar la plantilla), pero cuando intenta navegar a la url, Django sigue post_detail ver y se asusta.
Sin embargo, cuando invierto el orden de estas dos URL, todo funciona bien. ¿Importa el orden? Si es así, eso es bastante inconveniente para proyectos más grandes.
Si se necesita cualquier otra información, por favor hágamelo saber.
Un slug:…> también puede coincidir con una secuencia de números. Si visita posts/delete_comment/123 , Django intentará hacerlo coincidir con los patrones de URL y comenzará con el primero. Esta URL coincidirá con el patrón posts/<str:username>/<slug:slug>/ , ya que establece username = 'delete_comment' y slug = '123' .
Dado que Django siempre activa el primer patrón de URL que coincide, si intenta eliminar un comentario, activará viewPostDetail .
Lo que puede hacer es especificar los artículos en un orden diferente:
urlpatterns = [ # ↓ first try to match with the delete_comment URL pattern path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment"), path('posts/<str:username>/<slug:slug>',communities_views.viewPostDetail,name="post_detail") ]Otra opción es hacer dos patrones de URL que no se superpongan, por ejemplo con:
urlpatterns = [ # ↓ non-overlapping URLs path('posts/<str:username>/ view /<slug:slug>',communities_views.viewPostDetail,name="post_detail"), path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment") ]