在Django模板中分解标题菜单

在Django模板中分解标题菜单,django,navigation,django-views,django-templates,Django,Navigation,Django Views,Django Templates,我正在使用django构建一个网站,每个页面顶部都有一个标题,这基本上是一个带有几个链接的菜单,在整个页面中保持不变 但是,根据您所在的页面,我想通过添加类“active”来突出显示菜单上的相应链接。为了做到这一点,我目前正在做如下工作:每个页面都有一个完整的菜单块,它集成在一个不包含菜单的总体布局中。例如,第2页将如下所示: {% extends "layout.html" %} {% block menu %} <li><a href="{% url 'myapp:inde

我正在使用django构建一个网站,每个页面顶部都有一个标题,这基本上是一个带有几个链接的菜单,在整个页面中保持不变

但是,根据您所在的页面,我想通过添加类“active”来突出显示菜单上的相应链接。为了做到这一点,我目前正在做如下工作:每个页面都有一个完整的菜单块,它集成在一个不包含菜单的总体布局中。例如,第2页将如下所示:

{% extends "layout.html" %}
{% block menu %}
<li><a href="{% url 'myapp:index' %}">Home</a></li>
<li><a href="{% url 'myapp:page1' %}">page1</a></li>
<li class="active"><a href="{% url 'myapp:page2' %}">page2</a></li>
<li><a href="{% url 'myapp:page3' %}">page3</a></li>
{% endblock %}
{% include 'path/to/menu.html' with active="b"%} # or a or c or d.
{%extends“layout.html”%}
{%块菜单%}
  • {%endblock%}
    问题是,除了解决方案不太美观之外,每次我想添加标题菜单的链接时,我都必须修改我拥有的每一页。由于这远远不是最佳的,我想知道你们中是否有人知道更好的方法

    提前谢谢

    如果在每个视图中都有一个“页面”对象,则可以将导航项的slug与该对象的slug进行比较

    navigation.html

    <ul>
        {% for page in navigation %}
            <li{% ifequal object.slug page.slug %} class="active"{% endifequal %}>
                <a href="{{ page.get_absolute_url }}">{{ page.title }}</a>
            </li>
        {% endfor %}
    </ul>
    
    <html>
        <head />
        <body>
            {% include "navigation.html" %}
            {% block content %}
                Welcome Earthling.
            {% endblock %}
        </body>
    </html>
    
    {% extends "base.html" %}
    
    {% block content %}
        {{ object }}
    {% endblock %}
    
    其中导航可能是一个包含所有页面的
    context\u处理器
    变量,对象是当前的
    PageDetailView
    对象变量

    免责声明

    正如保罗所指出的,有许多解决你问题的方法。当然,这个解决方案假设每个视图都有一个页面对象,这个概念通常由一个用户来实现。如果您的视图不是来自页面应用程序,则必须在导航中插入页面伪装者(至少持有
    get_absolute\u url
    title
    属性)


    这可能是一个非常好的学习体验,但安装
    feinCMS
    django cms
    可能会节省时间,这两种cms都定义了
    应用程序内容
    原则。

    您可以使用
    include
    标记并将当前页面的值传递给它

    例如,这可能是一个单独的文件,仅用于声明菜单模板:

    menu.html
    希望有帮助

    您可以创建自定义templatetag:

    from django import template
    from django.core.urlresolvers import reverse, NoReverseMatch, resolve
    
    register = template.Library()
    
    @register.simple_tag
    def active(request, view_name):
        url = resolve(request.path)
        if url.view_name == view_name:
            return 'active'
        try:
            uri = reverse(view_name)
        except NoReverseMatch:
            uri = view_name
        if request.path.startswith(uri):
            return 'active'
        return ''
    
    并在模板中使用它来识别URL加载的页面

    <li class="{% active request 'car_edit' %}"><a href="{% url 'car_edit' car.pk %}">Edit</a></li>
    

  • 这不是一种非常枯燥的方法,在某些罕见的情况下,它可能是一种选择,但为什么它不枯燥?他说每页都重复菜单让他很烦恼。通过这种方式,您只需在一个模板中声明菜单。这就是干的定义!不要到处重复菜单。如果需要进行一些修改,只需更改菜单模板即可。这对我来说很有效。是的,但是你在模板中仍然有很多if子句,而不是动态检查activeAbout的值关于很多
    if
    s你是对的,但是,我可以在我的解决方案中使用你的解决方案,只传递
    导航
    列表,它将非常简单、漂亮、重构和枯燥。我刚带来了一个我以前在菜单上使用过的快速解决方案。代码确实很难看,但可能很容易美化。我仍然喜欢这样做,而不是在每个模板中重复菜单,但这只是我自己。我的解决方案是编写一个模板,并在其中存储所有呈现菜单的逻辑。此模板将接收一个参数,您可以使用该参数确定要将哪个菜单标记为活动菜单。您可以在需要包含带有适当参数的菜单的任何位置调用此模板。您只需将菜单写入每个模板中,即可替换为一个
    include
    标记。感谢您的帮助!如果我能很好地理解这需要在每次调用视图时传递一个包含所有页面的
    导航
    变量?我想我可以把它存储在控制器中的一个地方,这样就可以很容易地修改它
    <li class="{% active request 'car_edit' %}"><a href="{% url 'car_edit' car.pk %}">Edit</a></li>