【发布时间】:2011-11-19 17:10:38
【问题描述】:
我希望能够根据当前 URL 值做一个 if 标记。
例如,如果当前页面的 url 是 accounts/login/,则不显示链接,不传递视图中的变量。
我不确定如何为此写一个{% if %} 标签,可以吗?
【问题讨论】:
标签: django
我希望能够根据当前 URL 值做一个 if 标记。
例如,如果当前页面的 url 是 accounts/login/,则不显示链接,不传递视图中的变量。
我不确定如何为此写一个{% if %} 标签,可以吗?
【问题讨论】:
标签: django
您也可以使用以下方法对动态网址执行此操作:
{% url 'show_user_page' user=user as the_url %}
{% if request.get_full_path == the_url %}something{% endif %}
您的 urls.py 包含以下内容:
(r'^myapp/user/(?P<user>\d+)/$', 'show_user_page'),
我知道这一点是因为我花了很长时间起草一个 stackoverflow 问题,当时我在文档中找到了the answer。
我想说,即使在简单的情况下,这也可能是更好的方法,因为它的耦合更松散。
【讨论】:
as 让我很开心。通过包含标签在多个页面上使用相同的 sn-p,并且需要一种方法来根据页面上的不同显示不同的链接。无价的方法!
user 在模板的context 中。
如果你将“请求”对象传递给你的模板,那么你就可以使用这个:
{% if request.get_full_path == "/account/login/" %}
【讨论】:
对于动态url,也可以使用request.resolver_match属性(docs):
HttpRequest.resolver_match表示已解析 URL 的 ResolverMatch 实例。此属性仅在 URL 解析发生后设置,这意味着它在所有视图中可用,但在 URL 解析发生之前执行的中间件中不可用(不过,您可以在 process_view() 中使用它)。
返回的ResolverMatch 对象具有许多有用的属性,例如view_name 属性,它返回与您传递给url 模板标签以生成当前url 相同的名称。
view_name与 URL 匹配的视图的名称,包括命名空间(如果有)。
有关此属性和其他属性,请参阅 the docs。
将此应用于@nimasmi 回答中的示例,您将得到:
{% if request.resolver_match.view_name == 'show_user_page' %}something{% endif %}
您的 urls.py 包含以下内容:
(r'^myapp/user/(?P<user>\d+)/$', 'show_user_page'),
请注意,当您使用URL namespaces 时,view_name 将返回命名空间限定的 url/视图名称,例如app:urlname.
与@nimasmi 的答案相比,这简化了模板代码,不需要单独的{% url %} 标签来生成要比较的url。当您不需要比较视图参数而只需要比较视图名称时尤其如此。如果您确实需要比较 url 中的参数,您可以轻松使用 ResolverMatch.args 和 kwargs 属性。
【讨论】: