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.
^{} | Django documentation
在
urls.py
中定义:在模板中,您可以将此url引用为:
这将呈现为:
现在假设您想在您的
views.py
中执行类似的操作—例如,您正在处理另一个视图(而不是some_view
)中的另一个url(而不是/foo/
),并且您想将用户重定向到/foo/
(通常是成功提交表单的情况)。你可以这样做:
但如果你想在将来更改网址呢?您必须更新代码中对它的所有引用。这违反了DRY (Don't Repeat Yourself),即只编辑一个位置的整个想法,这是需要努力的。
相反,你可以说:
这将查找项目中定义的所有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。这是一个老问题,但这里有一些东西可以帮助别人。
官方文件:
例如在模板中(url标记)
例如在python代码中(使用
reverse
函数)相关问题 更多 >
编程相关推荐