Posted under » Django on 6 May 2021
Continued from Views - index and template, since you defined the name argument in the path() functions in the polls.urls module, you can remove a reliance on specific URL paths defined in your url configurations by using the {% url %} template tag: From
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
To
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
The way this works is by looking up the URL definition as specified in the polls.urls module. You can see exactly where the URL name of ‘detail’ is defined below:
path('<int:question_id>/', views.detail, name='detail'),
If you want to change the URL of the polls detail view to something else, perhaps to something like polls/specifics/12/ instead of doing it in the template (or templates) you would change it in polls/urls.py:
path('specifics/<int:question_id>/', views.detail, name='detail'),
In actual Django projects, there might be five, ten, twenty apps or more. How does Django differentiate the URL names between them? For example, the polls app has a detail view, and so might an app on the same project that is for a blog. How does one make it so that Django knows which app view to create for a url when using the {% url %} template tag?
The answer is to add namespaces to your URLconf. In the polls/urls.py file, go ahead and add an app_name to set the application namespace:
from django.urls import path from . import views app_name = 'polls' urlpatterns = [ path('', views.index, name='index'), path('<int:question_id>/', views.detail, name='detail'), path('<int:question_id>/results/', views.results, name='results'), path('<int:question_id>/vote/', views.vote, name='vote'), ]
This can be improved by changing question_id to pk.
Now change your template from
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>to
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>