如何检查模板上的路线?

How to check routes on template?

有谁知道如何使用 django 模板语言检查模板是否通过 url 路由访问?

这是我的情况:有这个模板 article.html,当通过 blog-home url 路由访问时显示博客的所有帖子,并且也只显示给定的帖子用户通过 user-posts url 路线。

此模板之所以如此工作,是因为定义将显示哪些帖子的是 views.py 中的 类。

话虽这么说,但这是我尝试做的事情:(我知道这是错误的

{% if url == 'user-posts' %}
  "Some HTML h1 tag I want do be shown only when this template is accessed via 'user-posts' url"
{% endif %}

如何编写此 if 语句的正确方法(如果有的话)?

您应该创建一个 custom templatetag,

my_app/templatetags/utils.py

from django import template

register = template.Library()


@register.simple_tag(takes_context=True)
def is_active_view(context, *view_names):
    request = context.get('request')
    for view_name in view_names:
        if getattr(request.resolver_match, 'view_name', False) and request.resolver_match.view_name == view_name:
            return True
    return ''

并以这种方式在您的模板中使用它,假设 blog-home 是您为 url 提供的 url 名称:

blog-home.html

{% load utils %}

{% is_active_view 'blog-home' as display_blog_home_section %}

{% if display_blog_home_section %}
<!-- Your code -->

{% endif %}

注意:此模板标签可以一次检查多个视图名称并支持命名空间 url :

{% is_active_view 'front:blog-home' 'front:blog-categories' as display %}

当 Django 匹配 url 模式时,ResolverMatch object is created and made available on the request object at request.resolver_match. This ResolverMatch object can be queried in your template to acheive what you want, the url_name 属性是匹配的 url 模式的名称

{% if request.resolver_match.url_name == 'user-posts' %}

如果您正在使用 boostrap 并尝试在您使用 boostrap 时使菜单选项“处于活动状态”,那么这是一个更优化的版本 URL

from django import template

register = template.Library()

@register.simple_tag(takes_context=True)
def is_active_tab(context, *view_names):
    request = context.get('request')
    for view_name in view_names:
        if getattr(request.resolver_match, 'view_name', '') == view_name:
            return 'active'
    return ''

而且你喜欢

                    <li class="nav-item {% is_active_tab 'games:list' %}">
                        <a class="nav-link" href="{% url 'games:list' %}">
                            {% translate "My Quizzes" %}
                        </a>
                    </li>
                    <li class="nav-item {% is_active_tab 'games:create' %}">
                        <a class="nav-link" href="{% url 'games:create' %}">
                            {% translate "New Game" %}
                        </a>
                    </li>

如果任何 view_names 匹配当前视图名称,它会向元素的 class 添加一个额外的 active class 名称。让模板写的更简洁