如果您已将项目组织成一个base.html
由其他模板扩展的模板,例如appname/pagename.html
,您可以使用以模板为中心的方法来突出显示活动的导航元素。
这种方法为您提供了一些解耦优势,我已在此答案的末尾详细说明了这一点。
我发现这种方法对于处理在大部分或所有站点中保持相同的广泛导航项非常有用。对于更详细的导航元素,例如呈现从数据存储中收集的项目的动态列表,它可能不是一个合适的解决方案。
在您的base.html
模板中,为每个导航元素添加一个块,为这些块提供唯一的名称:
<ul class="nav">
<li class="{% block navbar_class-home %}{% endblock %}">
<a href="#">Home</a>
</li>
<li class="{% block navbar_class-about %}{% endblock %}">
<a href="#">About</a>
</li>
<li class="{% block navbar_class-pricing %}{% endblock %}">
<a href="#">Pricing</a>
</li>
</ul>
在您的appname/pagename.html
模板中,如果您希望其中一个 nav 元素显示为活动状态,请覆盖使用active
作为内容的相应块。例如,要突出显示“关于”项:
{% block navbar_class-about %} active {% endblock %}
当您使用呈现该模板的视图时,它将呈现如下:
<ul class="nav">
<li class="">
<a href="#">Home</a>
</li>
<li class=" active ">
<a href="#">About</a>
</li>
<li class="">
<a href="#">Pricing</a>
</li>
</ul>
这提供了不依赖于 JavaScript 的初始呈现。(如果你正在做一个单页应用程序,你可以使用 JavaScript 修改导航栏类。)
对于许多(但不是全部)情况,这可能是与视图逻辑更好的分离表示:
您可以修改视图以将站点导航数据附加到模板上下文,但这样做会强烈地将演示文稿与视图层耦合,并使创建可重用应用程序或集成第三方应用程序变得更加困难。
视图已经在选择一个命名模板,这意味着您已经将一些与导航相关的信息传递给模板层。这可能就是你所需要的。
您可以使用模板上下文处理器来获取有关视图的一些信息,但这只是将强耦合移动到系统的另一层,而不是留在模板层中。