如何检查模板上的路线?
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 名称。让模板写的更简洁
有谁知道如何使用 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 名称。让模板写的更简洁