在urls.py文件中创建路径时,通常会这样做:
urlpatterns = [
path('foo/',views.FooView,name='bar'),
]
我是Django的初学者,但尚未在path函数中看到name参数的函数。此参数的作用是什么,如何在Django支持的网站内有效地使用它?简而言之,此参数的作用是什么,为什么在创建路径时包含它很重要?谢谢!
答案 0 :(得分:5)
有时您想命名视图,以便您可以通过名称而不是url来引用它们。这样,如果您的应用程序中的url发生更改,则只需要在一个位置(urls.py
模块)中更新代码。使用名称而不是经过硬编码的url的现有代码不需要更新。
例如,reverse
实用程序函数接受该名称并返回url:
from django.urls import reverse
reverse('bar')
如果您不使用名称,则移动路线很麻烦-您需要在所有模板和代码中查找并更新网址。
答案 1 :(得分:3)
想象一下,您需要编写一个URL来引用您的FooView
,然后您可以将其写为
<a href="/foo/">link</a>
但是,如果您以后改变主意,并希望对此视图使用qux/
,则会出现问题。因此,重写URL可能会导致大量重写。如果URL包含参数,这也很麻烦。假设您有一个带有pk
和type
参数的URL(例如foo/<pk>/qux/<type>
),那么您需要记住格式,并因此想出格式,这很麻烦:“ 是/foo/1/qux/2
还是/foo/2/qux/1
?”。
所以我们不想直接写这些URL,我们想确定这些:基于一些标识符和零个或多个参数来计算URL。通过在路径中定义一个名称,我们首先需要定义这样的标识符,然后我们可以为该路径定义一个名称。
所以现在我们可以在模板中改用{% url .. %}
模板标记,例如:
<a href="{% url 'bar' %}">link</a>
然后Django将进行数学运算,并将其替换为正确的URL。这不仅使我们省去了头痛,而且还保证了URL正确(当然,名称本身是正确的)。因此,如果它呈现HTML输出,则不必担心,我们可能会在其中一个URL中写错字了,因为{% url .. %}
标记如果找不到名称会出现错误,或者参数不匹配。
例如,当我们想要重定向到页面时,我们可以做同样的事情。如果我们有一个重定向到bar
的视图,则它看起来像:
def redirect_view(request):
return redirect('bar')
再一次,我们完成了。如果以后URL发生更改,或者例如当有人要实现翻译后的 URL(例如,您可以用英语运行服务器,用俄语运行一个服务器),则这些URL将具有正确的翻译。< / p>
如果URL包含参数,例如:
urlpatterns = [
path('foo/<int:pk>/edit',views.FooView,name='bar'),
]
我们也可以使用此参数。在模板中,它看起来像:
<a href="{% url 'bar' pk=2 %}">link</a>
或在视图中
def redirect_view(request):
return redirect('bar', pk=2)
该参数如何适合URL,这不是我们的问题。 Django会自己发现的。
答案 2 :(得分:1)
以上答案并不适合我作为初学者。也许我可以用更多的外行话来解释它。
在urls文件中添加url路径并定义相应的视图函数以对其进行处理后,如果我们想通过其他地方的视图或html页面模板文件中的视图来访问相同的url,就像变量名一样,在代码中使用名称和名称空间来访问它。这很有帮助,因为定义另一个URL路径和/或使用直接链接会使代码更难以维护。
例如:
x=5
xi=x+1
xd=x-1
xf=x
比下面的更好,因为如果有一天您想将x
更改为其他内容,那只是一次更改。
x=5
xi=6
xd=4
xf=5
关于如何使用它,您可以使用上面的答案或阅读django URL naming。
答案 3 :(得分:0)
以上都是很好的答案,但我想尝试用更简单的方式来解释
我在民意调查应用中的 urls.py:
urlpatterns = [
path('', views.index, name='index'),
# /polls/5/
# sends the values of question_id to the views
path('<int:question_id>/', views.detail, name='detail'),
# /polls/5/results
path('<int:question_id>/results', views.results, name='results'),
# /polls/5/vote
path('<int:question_id>/vote', views.vote, name='vote'),
]
我的 index.html 的一小部分是:
<a href="{% url 'index' %}">index</a>
<a href="{% url 'detail' question_id=1 %}">detail</a>
<a href="{% url 'results' question_id=1 %}">results</a>
在 index.html 中,这将索引详细信息结果显示为显而易见的链接,但请注意,在 <a>
标签中我使用了 Django 的 url
标签
Django 使用 url
标签的正确格式是:
{% url 'NAME OF URL here' any_variables_here %}
NAME OF URL
表示我们在 name
的 path()
参数中为 URL 命名的名称,这意味着我们只需要在 href
属性中使用 URL 的名称,我们现在不必在我们的代码中到处使用忙碌而复杂的 url,这是 Django 的一个很棒的特性。
最重要的优势是,如果我们在 urls.py 中更改我们的 URL,例如:
<int:question_id>/vote
到 <int:question_id>/funny_poll/vote
那么现在您无需担心更改之前使用过的每个文件中的 url。
这非常棒,Django 开发人员应该使用此功能。
快乐编码?