Django模板中{% url %}标签详解与命名空间应用

花开有时
花开有时
发布时间:2026-10-13 | 6人浏览过
原创

本文详解Django模板中{% url %}标签的用法,解析其如何根据视图函数端点值(app_name:name)生成动态URL。通过对比硬编码方式,说明使用url标签在路由变更时的维护优势,并结合主URL、APP URL及视图函数的完整配置示例,展示如何在HTML模板中正确传递参数并实现页面跳转。

Django模板中{% url %}标签的使用详解

Django模板标签中{% url %}的使用详解

文件路径:inclusions/_archives.html


...
{% for date in date_list %}
<li>
<a href="{% url 'blog:archive' date.year date.month %}" rel="external nofollow" >
{{ date.year }} 年 {{ date.month }} 月
</a>
</li>
{% endfor %}
...

{% url %}标签参数解析与端点值构成

在此上下文中,{% url %}模板标签的核心功能是解析名为blog:archive的视图函数所对应的URL模式,并将该模式中定义的年份和月份占位符替换为date.year与date.month的实际数值。

{% url %}标签接收的第一个参数用于指定被解析视图函数的端点值,该端点值由两部分组成,中间以冒号分隔。第一部分是应用urls.py文件中定义的app_name值(用于充当命名空间,确保不同应用下存在同名视图函数时不会发生冲突);第二部分是path函数中传入的name参数值。例如,在blog应用的urls.py模块中,若指定了app_name = 'blog',且archive视图函数的URL模式定义为path('archives/<int:year>/<int:month>/', views.archive, name='archive'),则对应的端点值即为blog:archive。

{% url %}标签接收的其余参数为URL路径参数,即URL模式中路径参数转换器需要捕获的具体值。例如,若archive视图函数对应的URL模式为archives/<int:year>/<int:month>/,且假设date.year=2017、date.month=5,那么执行{% url 'blog:archive' date.year date.month %}模板标签后,返回的URL值为/archives/2017/5/。

使用{% url %}标签避免硬编码的优势

为何推荐使用{% url %}模板标签?虽然将超链接的href属性直接设置为/archives/{{ date.year }}/{{ date.month }}/也能达到跳转目的,但这种写法属于硬编码。当前blog:archive视图函数对应的URL模式确实如此,但如果未来该模式发生变更,采用硬编码写法则需要逐一修改每一处包含/archives/{{ date.year }}/{{ date.month }}/的代码。而使用{% url %}模板标签,则无需进行任何手动修改,系统会自动根据新的URL模式生成正确的链接。

完整配置示例

示例配置

1、主urls.py文件配置如下:


from django.urls import path
from django.conf.urls import include
 
from myblog import views
urlpatterns = [
 
  path('', views.index), 
  path('myblog/', include('myblog.urls')),
]

2、APP的urls.py文件配置如下:


from django.urls import path
from myblog import views
 
urlpatterns = [
 
  path('', views.index), 
 
  path('login/', views.login, name='login'), # 这里设置name,为了在模板文件中,写name,就能找到这个路由
  path('book/', views.book, name='book'),
  path('movie/', views.movie, name='movie'),
  path('book/detail/<book_id>/<catgray>/', views.book_detail, name='detail'),
 
]

3、APP的views.py文件如下:


from distutils.command import register
 
from django.shortcuts import render, reverse, redirect
from django.http import HttpResponse
 
 
def index(request):
  return render(request, 'index.html', {'articles': 18})
 
def login(request):
  return HttpResponse("注册页面")
 
def book(request):
  return HttpResponse("读书页面")
 
 
def movie(request):
  return HttpResponse("电影页面")
 
 
def book_detail(request, book_id, catgray):
  text = '文章详情页,该文章ID是:%s,分类是:%s' % (book_id, catgray)
  return HttpResponse(text)

4、index.html文件如下:


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
 
 
<ul>
  <li><a href="/" rel="external nofollow" >首页</a></li>
 
  <li><a href="{% url 'login' %}?next=asd/ " rel="external nofollow" >登录</a></li>
  # 点读书就会调到,读书页,路径
  <li><a href="{% url 'book' %}" rel="external nofollow" rel="external nofollow" >读书</a></li>
  # 在这里,直接写name,就能找到urls文件中对应的路由
  <li><a href="{% url 'book' %}" rel="external nofollow" rel="external nofollow" >读书</a></li>
 
  <li><a href="{% url 'movie' %}" rel="external nofollow" >电影</a></li>
 
  <li><a href="{% url 'detail' book_id='1' catgray=2 %}" rel="external nofollow" >最火的一篇文章</a></li>
</ul>
 
</body>
</html>

至此,关于Django模板标签中url使用的详解已介绍完毕。如需了解更多Django url相关内容,请搜索本站历史文章或继续浏览后续文章,感谢支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表