3

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

但是,根据您所在的页面,我想通过添加“活动”类来突出显示菜单上的相应链接。为此,我目前正在执行以下操作:每个页面都有一个完整的菜单块,该块集成在不包含菜单的一般布局中。例如,page2 看起来像这样:

{% 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 %}

问题是,除了那个解决方案不是那么漂亮之外,每次我想向标题菜单添加一个链接时,我都必须修改我拥有的每一页。由于这远非最佳,我想知道你们中是否有人知道更好的方法。

提前致谢!

4

3 回答 3

6

您可以创建自定义模板标签:

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>
于 2013-05-17T14:02:29.133 回答
3

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

导航.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>

base.html

<html>
    <head />
    <body>
        {% include "navigation.html" %}
        {% block content %}
            Welcome Earthling.
        {% endblock %}
    </body>
</html>

page.html

{% extends "base.html" %}

{% block content %}
    {{ object }}
{% endblock %}

导航可能是一个包含context_processor所有页面的变量,而对象是当前PageDetailView对象变量

免责声明

Paulo 指出,您的问题有很多解决方案。当然,这个解决方案假设每个视图都拥有一个页面对象,这个概念通常由CMS实现。如果您的视图不是从 Page 应用程序派生的,则必须在导航中注入页面伪装器(至少包含一个get_absolute_urlandtitle属性)。

这可能是一个非常好的学习体验,但您可能会节省安装时间 ,feinCMS或者django-cms两者都定义了一个ApplicationContent原则。

于 2013-05-17T13:25:17.243 回答
1

您可以使用include标签并将其传递给当前页面的值。

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

菜单.html

{% if active = "a" %}
<li><a href="{% url 'myapp:index' %}">Home</a></li>
{% if active = "b" %}
<li><a href="{% url 'myapp:page1' %}">page1</a></li>
{% if active = "c" %}
<li class="active"><a href="{% url 'myapp:page2' %}">page2</a></li>
{% if active = "d" %}
<li><a href="{% url 'myapp:page3' %}">page3</a></li>

并从您的模板中调用它,如下所示:

{% include 'path/to/menu.html' with active="b"%} # or a or c or d.

希望能帮助到你!

于 2013-05-17T13:26:11.477 回答