【问题标题】:Django template, if tag based on current URL valueDjango 模板,if 标记基于当前 URL 值
【发布时间】:2011-11-19 17:10:38
【问题描述】:

我希望能够根据当前 URL 值做一个 if 标记。

例如,如果当前页面的 url 是 accounts/login/,则不显示链接,不传递视图中的变量。

我不确定如何为此写一个{% if %} 标签,可以吗?

【问题讨论】:

标签: django


【解决方案1】:

您也可以使用以下方法对动态网址执行此操作:

{% 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,并且需要一种方法来根据页面上的不同显示不同的链接。无价的方法!
  • 谢谢你,我真的认为它会比这更难。 url 别名很有用,因为我不确定如何将完整路径与仅在要比较的路径中没有任何可辨别的根索引页面进行比较
  • 还要确保user 在模板的context 中。
【解决方案2】:

如果你将“请求”对象传递给你的模板,那么你就可以使用这个:

{% if request.get_full_path == "/account/login/" %}

【讨论】:

  • 这里有一个非常小的错字,我无法通过编辑进行更新。您需要使用 == 而不是 = 进行比较。
【解决方案3】:

对于动态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.argskwargs 属性。

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2012-11-29
    • 2023-03-24
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多