在Django中用URL标签创建动态链接的方法

233 阅读3分钟

Create Dynamic Links With URL Tag In Django

在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是传递给该路径的一个参数
  • 可以包含一个以上的参数,用空格分隔。

生成的链接

看一下模板中