什么是Django中的reverse()
当我有时阅读Django的代码,我看到在一些模板reverse()
。 我不太确定这是什么,但它与HttpResponseRedirect一起使用。 这个reverse()
应该怎么使用?
如果有人用一些例子给出了答案,这将是很好的…
https://docs.djangoproject.com/en/stable/ref/urlresolvers/#reverse
在你的urls.py
定义这个:
url(r'^foo$', some_view, name='url_name'),
在一个模板中,你可以参考这个url:
<!-- django <= 1.4 --> <a href="{% url url_name %}">link which calls some_view</a> <!-- django >= 1.5 or with {% load url from future %} in your template --> <a href="{% url 'url_name' %}">link which calls some_view</a>
这将呈现为
<a href="/foo/">link which calls some_view</a>
现在说你想在你的views.py
做类似的事情 – 比如你正在处理其他一些url(not /foo/
)而不是some_view
而你想把用户redirect到/foo/
在成功的表单提交)
你可以做
return HttpResponseRedirect('/foo/')
但是如果以后要更改url会怎么样 – 您必须更新您的代码中的urls.py
和所有对它的引用。 这违反干(谷歌它)。
相反,你可以说
from django.core.urlresolvers import reverse return HttpResponseRedirect(reverse('url_name'))
这将通过您的项目中定义的所有url来查找名称url_name
定义的url,并返回实际的url /foo/
。
这意味着你只能通过它的name
属性来引用这个url – 如果你想改变url本身或者它引用的视图,你可以通过只编辑一个地方来实现 – urls.py
这个只编辑一个地方的整个想法被称为“不要重复自己”,是要争取的东西。
有一个这样的文件
https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
它可以用来为给定视图生成一个URL
主要优点是你不用在你的代码中硬编码路由。
该function支持干燥原则 – 确保您不会在整个应用程序中对url进行硬编码。 一个url应该在一个地方定义,只有一个地方 – 你的urlconf。 之后,你真的只是参考这个信息。
使用reverse()
给你一个页面的url,给出视图的path或者你的url conf中的page_name参数。 如果在{% url 'my-page' %}
的模板中使用它,那么您可以使用它。
有很多可能的地方你可以使用这个function。 我发现我使用它的一个地方是在视图中redirect用户(通常在成功处理表单之后) –
return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))
编写模板标签时,您也可以使用它。
另一次我使用reverse()
与模型inheritance。 我在父模型上有一个ListView,但是想从这些父对象中的任何一个获取它的关联子对象的DetailView。 我给父母附加了一个get__child_url()
函数,该函数标识了一个孩子的存在,并使用reverse()
返回了它的DetailView的url。
太旧的问题,但这可能有助于某人
从官方文档
“Django提供了用于执行URL反转的工具,以匹配需要URL的不同层:在模板中:使用url模板标签在Python代码中:使用reverse()函数在与处理Django模型的URL相关的更高级代码实例:get_absolute_url()方法。“
例如:在模板(url标签)
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
例如:在Python代码(反向function)
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
reverse()用于坚持django DRY原则,即如果将来更改url,则可以使用reverse(urlname)引用该URL。