我正在尝试根据用户所在的当前页面更改导航链接的活动选择。
我正在尝试做这样的事情:
<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 %}
,但我更喜欢像我在第一个例子中尝试实现的内容,如果可能的话
谢谢!
答案 0 :(得分:17)
由于您可能只需要执行一次 - 在导航模板中 - 将一切保存在一个地方对我来说更有意义。
首先反转您的网址名称并将其存储在Timmy建议的变量中,然后在模板中进行比较:
{% url 'about_page' as about %}
...
<ul id="nav">
<li class="{% ifequal request.path about %}active{% endifequal %}"><a href="{{about}}">About</a></li>
...
确保启用了请求上下文处理器,以便您可以访问模板中的请求。通过在django.core.context_processors.debug
设置变量中添加TEMPLATE_CONTEXT_PROCESSORS
来执行此操作。
答案 1 :(得分:6)
这是一个非常常见的要求,因此编写自己的模板标签来执行此操作可能是值得的:
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:])
并在您的模板中
{% 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>
...
这个想法略有不同:
http://gnuvince.wordpress.com/2007/09/14/a-django-template-tag-for-the-current-active-page/ http://www.turnkeylinux.org/blog/django-navbar
答案 2 :(得分:3)
怎么样:
<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技巧可以在没有太多代码的情况下完成。我会说更多,但今天早上只喝了半杯咖啡..