在 Django 项目中,一个常见需求是获取最终形式的 URL,比如用于嵌入生成的内容中(视图和资源网址,给用户展示网址等)或用户服务器端的导航处理(重定向等)。
强烈建议不要硬编码 URL(这是一个费力、不能扩展、容易出错的主意)。同样危险的是设计临时机制来生成的 URL 与URLconf描述的设计的URL一样,这会导致 URL 随着时间的推移变得过时。
换句话说,需要的是 DRY 机制。除其他优势外,它还允许 URL 设计自动更新,而不必遍历所有项目代码来搜索和替换过时的 URL 。
我们用来获取 URL 的首要信息是负责处理它的视图的标识(例如名称)。必须参与查找正确网址的其他信息是视图参数的类型(位置、关键字)和值。
Django 提供了一个解决方案,使得 URL 映射是 URL 设计唯一的仓库。你使用 URLconf 来填充它,然后可以双向使用它:
Django 提供执行反转 URL 的工具,这些工具与需要 URL 的不同层匹配:
reverse()
函数。
get_absolute_url()
方法。例如:
from django.urls import path
from . import views
urlpatterns = [
#...
path("articles/<int:year>/", views.year_archive, name="news-year-archive"),
#...
]
根据这个设计,与 year nnnn
相对应的 URL 是 /articles/<nnnn>/
。
你可以使用以下方式在模板代码中来获取它们:
<a href="{% url "news-year-archive" 2012 %}">2012 Archive</a>
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url "news-year-archive" yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
或在Python代码中:
from django.http import HttpResponseRedirect
from django.urls import reverse
def redirect_to_year(request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse("news-year-archive", args=(year,)))
因为某些原因,如果决定改变每年已发布的文章存档内容的 URL ,你只需要改变 URLconf 中的条目即可。
在一些视图具有一般性质的场景下,URLs 和视图存在多对一关系。对于这些情况,当反转 URLs 时,视图名并不是一个足够好的标识符。阅读下一节来了解 Django 如何解决这一问题。
所有 Django 支持的数据库后端都支持迁移,还有些支持表修改(通过 SchemaEditor 类实现)的第三方后端也支持。然而,有些数据库...
除前面说的基础请求/响应中间件模式外,你可以给基于类的中间件添加三种其他特殊方法:process_view()process_view(request, vie...
该会话目录在使用 JSONSerializer 时接受任何 json 序列化值或者当使用 PickleSerializer 时接受任何 picklable Pyt...
默认情况下,Django 为每个模型类添加了一个名为 objects 的 Manager。不过,若你想将 objects 用作字段名,或想使...
Java Swing教程 -Java Swing BorderLayoutBorderLayout将容器的空间分为五个区域:北,南,东,西和中心。BorderLayout将容器的空...
Java Swing教程 -Java Swing JColorChooser方法...以下代码使用JColorChooser选择一种颜色,并在标准输出上打印一条消息:import ...
Java Swing教程 -Java Swing颜色显示垂直工具栏...我们可以使用它的RGB(红,绿,和蓝色)组分。我们可以使用它的RGB(红,绿,和蓝...
Java Swing教程 -Java Swing JButtonJButton也称为按钮。用户按下或单击JButton以执行操作。创建JButtonJButton可以显示文本和图...
数据库厂商标识(databaseIdProvider)MyBatis可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的d...
Spring教程 - 弹簧集属性我们可以将值或值列表填充到Spring xml配置文件中定义的Java bean。我们可以将值或值列表填充到Spring x...