如何在jinja2中编辑一些扩展块?

时间:2013-03-04 12:20:53

标签: django django-templates flask jinja2

我有一个名为 main.html 的基本模板:

<ul>
  <li>index</li>
  <li>about</li>
  <li>contacts</li>
</ul>

我有一个模板 index.html ,其中包含:

{% extends "main.html" %}

如何根据已命名的继承人将类属性添加到<li>标记中?

例如,如果 index.html 扩展 main.html ,那么我将class="active"添加到第一个<li>,如果关于.html 扩展 main.html ,然后我将class="active"添加到第二个<li> ....依此类推。

我怎么做?

3 个答案:

答案 0 :(得分:1)

一种方法是保持main.html不变并通过调用super在子级别(about.html等)覆盖它?我没有测试过这段代码,但是:

main.html中

{% block menu_bar %}
<ul>
  <li>index</li>
  <li>about</li>
  <li>contacts</li>
</ul>
{% endblock %}

about.html

{% block menu_bar %}
<li class="active">about</li>
{{ super() }}
{% endblock %}

答案 1 :(得分:0)

对此有两种解决方法:

第一种方法是定义一个宏并从子页面(而不是继承的main页面)调用它,其中包含使<li>活动的信息。

喜欢:

{% macro menu(active) %}

<ul>
  {% if active == 'index' %}<li class="active">{% else %}<li>{%endif%}index</li>
  {% if active == 'about' %}<li class="active">{% else %}<li>{%endif%}about</li>
  {% if active == 'contacts' %}<li class="active">{% else %}<li>{%endif%}contacts</li>
</ul>

{% endmacro %}

并将其用作:

{% from 'macro.html' import menu %}

{{ macro('index') }} #in index.html
{{ macro('about') }} #in about.html
{{ macro('contacts') }} #in contacts.html

另一种方法是使用神奇的g变量。在您的视图中,函数定义哪个项应该是活动项,并放入g变量。像:

from flask import g

app.route('/about')
def about():
  ...
  g.active_menu_item = 'about'

  ...

  return render_template('about.html')

您的about.html(索引和联系人)也会从main.html', so the codes that render menu of main.html should consider g.active_menu_item`继承。像:

main.html:

<ul>
  {% if g.active_menu_item == 'index' %}<li class="active">{% else %}<li>{%endif%}index</li>
  {% if g.active_menu_item == 'about' %}<li class="active">{% else %}<li>{%endif%}about</li>
  {% if g.active_menu_item == 'contacts' %}<li class="active">{% else %}<li>{%endif%}contacts</li>
</ul>

答案 2 :(得分:0)

<强> menu.html

<ul>
  <li class="{% if active_menu == 'index' %}active{% endif %}">index</li>
  <li class="{% if active_menu == 'about' %}active{% endif %}">about</li>
  <li class="{% if active_menu == 'contacts' %}active{% endif %}"contacts</li>
</ul>

<强>的index.html

{% extends "main.html" %}

{% include "menu.html" with active_menu='index' %}

<强> about.html

{% extends "main.html" %}

{% include "menu.html" with active_menu='about' %}

<强> contacts.html

{% extends "main.html" %}

{% include "menu.html" with active_menu='contacts' %}