Django模板:将当前url与{%url xyz%}进行比较
我正在尝试根据用户所在的当前页面更改导航链接的活动选择 我正试图做这样的事情:Django模板:将当前url与{%url xyz%}进行比较,django,django-templates,Django,Django Templates,我正在尝试根据用户所在的当前页面更改导航链接的活动选择 我正试图做这样的事情: <li {% if request.get_full_path == {% url profile_edit_personal %} %}class="current"{% endif %}><a href="{% url profile_edit_personal %}">Personal Details</a></li> <li class="{% bloc
<li {% if request.get_full_path == {% url profile_edit_personal %} %}class="current"{% endif %}><a href="{% url profile_edit_personal %}">Personal Details</a></li>
<li class="{% block current %}{% endblock %}"><a href="{% url profile_edit_personal %}">Personal Details</a></li>
或者,我知道我可以这样做:
<li {% if request.get_full_path == {% url profile_edit_personal %} %}class="current"{% endif %}><a href="{% url profile_edit_personal %}">Personal Details</a></li>
<li class="{% block current %}{% endblock %}"><a href="{% url profile_edit_personal %}">Personal Details</a></li>
并将{%block current%}current{%endblock%}
添加到每个相关模板中,但如果可能的话,我更喜欢像我在第一个示例中尝试实现的那样
谢谢 那么:
<li {% if request.get_full_path == profile_edit_personal.get_absolute_url %}
class="current"{% endif %}><a href="{% url profile_edit_personal %}">
Personal Details</a></li>
其中get_absolute_url如Django文档中所述
这可能仍然不是定制活动导航菜单标题的最佳方式,不过,可能有一些CSS技巧可以在不需要那么多代码的情况下实现这一点。我想说的更多,但今天早上只喝了半杯咖啡。这是一个非常常见的要求,因此可能值得编写您自己的模板标记来执行此操作:
class isCurrentNode(template.Node):
def __init__(self, patterns):
self.patterns = patterns
def render(self, context):
path = context['request'].path
for pattern in self.patterns:
curr_pattern = template.Variable(pattern).resolve(context)
if path == curr_pattern:
return "current"
return ""
@register.tag
def is_current(parser, token):
""" Check if the browse is currently at this supplied url"""
args = token.split_contents()
if len(args) < 2:
raise template.TemplateSyntaxError, "%r tag requires at least one argument" % args[0]
return isCurrentNode(args[1:])
class isCurrentNode(template.Node):
定义初始化(自,模式):
self.patterns=模式
def呈现(自身、上下文):
路径=上下文['request']。路径
对于self.patterns中的模式:
curr\u pattern=template.Variable(pattern).resolve(context)
如果路径==当前模式:
返回“当前”
返回“”
@register.tag
def是_当前(解析器、令牌):
“”“检查浏览当前是否位于此提供的url”“”
args=token.split_contents()
如果len(args)<2:
raise template.TemplateSyntaxError,“%r”标记至少需要一个参数“%args[0]
返回isCurrentNode(参数[1:])
在你的模板中
{% url about_page as about %}
{% url home_page as home %}
...
<ul>
<li class="{% is_current home %}"><a href="{{ home }}">Home</a></li>
<li class="{% is_current about %}"><a href="{{ about }}">About</a></li>
...
{%url关于\页面作为关于%}
{%url主页\作为主页%}
...
...
以下是相同的想法,但有点不同:
http://www.turnkeylinux.org/blog/django-navbar因为您可能只需要在导航模板中执行一次,所以对我来说,将所有内容都放在一个地方更有意义 首先反转url名称并将其存储在Timmy建议的变量中,然后在模板中进行简单比较:
{% url 'about_page' as about %}
...
<ul id="nav">
<li class="{% ifequal request.path about %}active{% endifequal %}"><a href="{{about}}">About</a></li>
...
{%url'关于页面'作为关于%}
...
只需确保已启用请求上下文处理器,以便可以访问模板中的请求。通过在TEMPLATE\u context\u processors
settings变量中添加django.core.context\u processors.debug
来完成此操作