Djang中的reverse()是什么

2024-05-16 22:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

当我有时阅读django代码时,我在一些模板中看到reverse()。我不太清楚这是什么,但它是与HttpResponseRedirect一起使用的。这个reverse()应该怎么用,什么时候用?

如果有人用一些例子来回答我,那就太好了。。。


Tags: django代码模板例子reversehttpresponseredirect
3条回答

^{} | Django documentation


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中执行类似的操作—例如,您正在处理另一个视图(而不是some_view)中的另一个url(而不是/foo/),并且您想将用户重定向到/foo/(通常是成功提交表单的情况)。

你可以这样做:

return HttpResponseRedirect('/foo/')

但如果你想在将来更改网址呢?您必须更新代码中对它的所有引用。这违反了DRY (Don't Repeat Yourself),即只编辑一个位置的整个想法,这是需要努力的。

相反,你可以说:

from django.urls import reverse
return HttpResponseRedirect(reverse('url_name'))

这将查找项目中定义的所有url,查找名称为url_name的url,并返回实际的url /foo/

这意味着您只能通过url的name属性引用url-如果您想更改url本身或它引用的视图,可以通过编辑一个位置-urls.py来完成此操作。

这个函数支持dry原则——确保你不会在整个应用程序中硬编码url。一个url应该定义在一个地方,而且只有一个地方-你的url conf.在那之后,你真的只是引用那个信息。

使用reverse()可以给出页面的url,给定视图的路径,或者url配置中的page-name参数。如果在模板中使用{% url 'my-page' %}没有意义,则可以使用它。

您可以在很多地方使用此功能。我发现我使用它的一个地方是在视图中重定向用户(通常在成功处理表单之后)—

return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))

在编写模板标记时也可以使用它。

我使用reverse()的另一次是模型继承。我在父模型上有一个ListView,但是想从这些父对象中的任何一个获取到它关联的子对象的DetailView。我将一个get__child_url()函数附加到父函数,该函数标识子函数的存在,并使用reverse()返回其DetailView的url。

这是一个老问题,但这里有一些东西可以帮助别人。

官方文件:

Django provides tools for performing URL reversing that match the different layers where URLs are needed: In templates: Using the url template tag. In Python code: Using the reverse() function. In higher level code related to handling of URLs of Django model instances: The get_absolute_url() method.

例如在模板中(url标记)

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

例如在python代码中(使用reverse函数)

return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

相关问题 更多 >