在urls.py文件中创建路径时,通常会这样做:
urlpatterns = [
path('foo/',views.FooView,name='bar'),
]
我是Django的初学者,但我还没有看到path函数中name参数的函数。这个参数的作用是什么?如何在Django支持的网站中有效地使用它?简而言之,这个参数的作用是什么,为什么在创建路径时包含它很重要?谢谢
有时您想要命名视图,以便可以通过名称而不是url来引用它们。这样,如果你的应用程序中的url发生了变化,你只需要在一个地方更新代码(urls.py
模块)。使用名称而不是url硬编码的现有代码不需要更新。
例如,reverse
实用程序函数接受此名称并返回url:
from django.urls import reverse
reverse('bar')
如果你不使用这个名称,那么移动路由是很麻烦的——你需要在所有模板和代码中找到并更新url。
想象一下,您需要编写一个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将具有正确的翻译。
如果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自己会发现的。
作为一个初学者,以上答案并不适合我。也许我可以用更通俗的术语来解释。
在urls文件中添加了一个url路径,并定义了相应的视图函数来处理它之后,如果我们想通过其他地方的视图访问同一个url,或者可能在html页面的模板文件中,你可以使用代码中的名称和命名空间来访问它,就像变量名一样。这很有帮助,因为定义另一个url路径和/或使用直接链接会使代码更难维护。
例如:
x=5
xi=x+1
xd=x-1
xf=x
比下面的要好,因为如果你想在某一天将x
更改为其他内容,只需一次更改。
x=5
xi=6
xd=4
xf=5
至于如何使用,您可以使用上面的答案或阅读djangoURL命名。
以上都是很好的答案,但我想尝试用更简单的方式来解释
我的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
是指我们在path()
的name
参数中为URL命名的名称,这意味着我们只需要在href
属性中使用URL的名称,我们现在不必在代码中到处使用繁忙而复杂的URL,这是Django的一个很棒的功能。
最重要的优点是,如果我们在urls.py中更改URL,比如:<int:question_id>/vote
到<int:question_id>/funny_poll/vote
,那么现在您不需要担心更改每个文件中的url,无论您以前在哪里使用它。
这非常棒,Django开发人员应该使用这个功能。
HaPpY编码🤗