什么是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。