{% url %} is a template tag for generating URLs by route name.
Basic Usage
# urls.py
urlpatterns = [
path('tasks/', views.task_list, name='task-list'),
path('tasks/<int:pk>/', views.task_detail, name='task-detail'),
path('tasks/new/', views.task_create, name='task-create'),
]
<!-- Simple URL -->
<a href="{% url 'task-list' %}">All tasks</a>
<!-- Result: /tasks/ -->
<!-- URL with parameter -->
<a href="{% url 'task-detail' pk=task.pk %}">{{ task.title }}</a>
<!-- Result: /tasks/42/ -->
<!-- Positional argument -->
<a href="{% url 'task-detail' task.pk %}">{{ task.title }}</a>
With Namespace
<a href="{% url 'tasks:list' %}">List</a>
<a href="{% url 'tasks:detail' pk=task.pk %}">Details</a>
Saving to a Variable
{% url 'task-detail' pk=task.pk as task_url %}
<a href="{{ task_url }}">Link</a>
<!-- Useful for conditional rendering -->
{% url 'task-edit' pk=task.pk as edit_url %}
{% if edit_url %}
<a href="{{ edit_url }}">Edit</a>
{% endif %}
Multiple Parameters
# url: /courses/<course_slug>/lessons/<lesson_pk>/
path('<slug:course_slug>/lessons/<int:lesson_pk>/', views.lesson_detail, name='lesson-detail'),
{% url 'lesson-detail' course_slug=course.slug lesson_pk=lesson.pk %}
Why {% url %} Is Better Than Hardcoding
<!-- Bad: hardcoded path -->
<a href="/tasks/{{ task.pk }}/">Task</a>
<!-- Good: when the URL changes in urls.py, templates update automatically -->
<a href="{% url 'task-detail' pk=task.pk %}">Task</a>
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!