在Django中,你通常希望避免在应用程序中硬编码链接。我们在Named URLs和Reverse Function教程中看到了这方面的例子。在Django模板中也是如此。我们不希望在模板中硬编码链接,因为如果应用程序在未来发生变化,它们可能会损坏。url标签提供了一种在任何Django模板中动态生成链接的方法。现在让我们来看看如何使用这个标签。
模板与视图不同
在views.py文件中,我们使用类似这样的代码动态地创建了一个链接。
reverse('namedurl', args=[redirect_to])
这在模板中不起作用,我们需要一种新的方式来处理在模板中创建动态链接。我们的方法是使用url标签。
url
返回一个与给定的视图和可选参数相匹配的绝对路径引用(没有域名的URL)。返回的路径中的任何特殊字符将使用iri_to_uri()进行编码。
链接到一个路径
使用url标签的先决条件是urls.py中存在正确的路径。此外,在urls.py的urlconf中,任何你想链接的路径都需要被命名。在我们的例子中,这个方法很好,因为我们在urls.py中确实有一个命名的路由,它在这里被突出显示。
goals\urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.homepage),
path('<int:timeframe>', views.goals_by_int_timeframe),
path('<str:timeframe>', views.goals_by_timeframe, name='namedurl'),
]
现在我们可以访问这个文件,在那里我们将动态地生成一个指向这个路由的链接。我们可以简单地建立在前面教程的例子上。
goals\templates\goals\index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
{% for timeframe in timeframes reversed %}
{% if timeframe == 'monthly' %}
<li><a href="{% url 'namedurl' timeframe %}">{{ timeframe|upper }}</a></li>
{% else %}
<li><a href="{% url 'namedurl' timeframe %}">{{ timeframe|capfirst }}</a></li>
{% endif %}
{% endfor %}
</ul>
</body>
</html>
在看上面突出的几行,我们可以看到在这个模板中创建动态链接的两个实例。其格式如下。
{% url 'namedurl' timeframe %}}。
- url是一个标签,它的操作类似于一个函数
- namedurl是要链接到的路径的名称
- timeframe是传递给该路径的一个参数
- 可以包含一个以上的参数,用空格分隔。
生成的链接
看一下模板中
- 标签之间的内容,我们看到了这个。
{% for timeframe in timeframes reversed %}
{% if timeframe == 'monthly' %}
<li><a href="{% url 'namedurl' timeframe %}">{{ timeframe|upper }}</a></li>
{% else %}
<li><a href="{% url 'namedurl' timeframe %}">{{ timeframe|capfirst }}</a></li>
{% endif %}
{% endfor %}
这个页面的HTML源代码中生成的标记看起来是这样的。
<li><a href="/goals/monthly">MONTHLY</a></li>
<li><a href="/goals/weekly">Weekly</a></li>
<li><a href="/goals/daily">Daily</a></li>
我们可以看到url标签是如何为我们动态地创建这些链接的。这是一个很好的工具,可以确保你的Django应用程序中的链接是健壮的,并且随着时间的推移是可以适应未来的。
了解更多关于Django中的URL标签的信息
- 在Django模板中使用Url(stackoverflow.com)
- Team Treehouse Library Url Tag(teamtreehouse.com)
- Django Url标签和反向函数示例 (code-learner.com)。
- Django Url模板(askpython.com)
- Django模板中命名的URL标签的Pycharm完成和导航(jetbrains.com)
- 如何在Django模板的Url标签中添加Url参数(stackoverflow.com)
- 在Django中创建Url (overiq.com)
- Sophilabs Django网址模板标签(github.com)
