我正在尝试根据用户所在的当前页面更改导航链接的活动选择。
我正在尝试做这样的事情:
<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 %}
但我更喜欢像我在第一个示例中尝试实现的目标(如果可能的话)
谢谢!
由于您可能只需要在导航模板中执行此操作一次,因此对我来说将所有内容都放在一个地方更有意义。
首先反转你的网址名称并将它们存储在像 Timmy 建议的变量中,然后简单地在模板中比较它们:
{% url 'about_page' as about %}
...
<ul id="nav">
<li class="{% if request.path == about %}active{% endif %}">
<a href="{{about}}">About</a>
</li>
...
只需确保您启用了请求上下文处理器,以便您可以访问模板中的请求。通过在
django.core.context_processors.debug
设置变量中添加 TEMPLATE_CONTEXT_PROCESSORS
来完成此操作。
这是一个相当常见的要求,因此可能值得编写自己的模板标签来执行此操作:
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
怎么样:
<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 技巧可以做到这一点,而无需太多代码。我想说更多,但今天早上只喝了半杯咖啡..