当我阅读Django代码时,有时会在一些模板中看到reverse()。我不太确定这是什么,但它与HttpResponseRedirect一起使用。如何以及何时应该使用这个reverse() ?
当前回答
这是一个老问题,但这里有一些东西可能会帮助到一些人。
官方文件显示:
Django提供了用于执行URL反转的工具 需要url的不同层:模板中:使用url 模板标签。在Python代码中:使用reverse()函数。在高等 与Django模型实例的url处理相关的级别代码 get_absolute_url()方法。
如。在模板中(url标签)
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
如。在python代码中(使用reverse函数)
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
其他回答
reverse() | Django文档
让我们假设在你的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(不是/foo/)在一些其他的视图(不是some_view),你想重定向用户到/foo/(通常在成功提交表单的情况下)。
你可以这样做:
return HttpResponseRedirect('/foo/')
但是,如果将来想更改URL该怎么办呢?您必须更新urls.py以及代码中对它的所有引用。这违反了DRY(不要重复自己)原则和只在一个地方编辑的整个思想——这是需要努力的。
相反,你可以说:
from django.http import HttpResponseRedirect
from django.urls 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
主要的优点是您不必在代码中硬编码路由。
该函数支持干原则-确保你不硬编码url在你的应用程序。一个url应该定义在一个地方,只有一个地方-你的url配置。之后,你真的只是引用该信息。
使用reverse()来给你一个页面的url,给定视图的路径,或者url conf中的page_name参数。你可以在模板中使用{% url 'my-page' %}没有意义的情况下使用它。
有很多地方可以使用这个功能。我发现我使用它的一个地方是在视图中重定向用户时(通常是在成功处理表单之后)
返回HttpResponseRedirect(反向(thanks-we-got-your-form-page))
您也可以在编写模板标记时使用它。
另一次我使用reverse()是模型继承。我有一个父模型上的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代码中(使用reverse函数)
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
reverse()用于坚持django的DRY原则,即如果你在未来改变url,那么你可以使用reverse(urlname)引用该url。
推荐文章
- Django模型表单对象的自动创建日期
- 错误:“字典更新序列元素#0的长度为1;2是必需的”
- 改变Django的SECRET_KEY的效果
- 当Django只启动一次时执行代码?
- Django设置“SECRET_KEY”的目的是什么?
- 以编程方式将图像保存到Django ImageField中
- 嵌入YouTube视频-拒绝在帧中显示,因为它将“X-Frame-Options”设置为“SAMEORIGIN”
- django test app error -在创建测试数据库时出现错误:创建数据库的权限被拒绝
- django MultiValueDictKeyError错误,我如何处理它
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块
- Django - makemigrations -未检测到任何更改
- ">", "<", ">=" 和“< =”不工作”在Django过滤()”
- Django项目工作目录结构的最佳实践
- 如何在Django中表达一对多关系?