Jinja2的OrderBlocks扩展
jinja2_orderblocks的Python项目详细描述
简介
这是Jinja2的扩展 允许您选择和重新排序继承块的模板引擎。
示例1:按子模板指定的顺序
在本例中,网站可能希望发布一些文章。 每篇文章都显示了文章的一些基本信息,主要是 故事本身,也许还有一些图像。 这可以通过模板“article.html”完成 继承自网站的主“layout.html”模板 重写内容块以包含三个新块: 简介,故事和图片:
{% extends 'layout.html' %} {% block content %} {% orderblocks article_order %} {% block introduction %} <ul> <li>Some introductory information</li> <li>E.g. date, author, …</li> </ul> {% endblock %} {% block story %} <p>Article story goes here …</p> {% endblock %} {% block images %} <p> <img src="..." /> </p> {% endblock %} {% endorderblocks %} {% endblock %}
请注意,这些块包含在orderblocks标记中。 这需要一个参数,指定显示 包含块。 (忽略任何非块内容。) 在本例中,此参数由article_order参数给出。 当这个未定义时,如这里所示,(或没有),块显示在 原始订单。
但是也可能有一些特殊的文章,比如 图片特写文章。 在这里,图片应该出现在故事文本之前的特殊显示中。 此类文章的模板可以继承自“article.html” 模板,但为项目顺序指定一个值参数:
{% extends 'article.html' %} {% set article_order = ('introduction', 'images', 'story') %} {% block images %} <!-- Placeholder for fancy image display! --> <big>{{ super() }}</big> {% endblock %}
例2:动态指定顺序
块排序参数当然也可以由 模板上下文参数。 在这里,一个页面允许用户指定哪些部分 他们希望通过请求参数查看和排序:
from flask import Flask, render_template, request app = Flask(__name__) app.jinja_options['extensions'].append( 'jinja2_orderblocks.OrderBlocks') @app.route('/example/') def example_page(): return render_template( 'example_template.html', article_order=request.args['order'].split(','))
它可以和一个包含许多部分的模板一起使用, 例如以下片段:
{% orderblocks article_order %} {% block x %} <section> <h2>Section X</h2> <p>…</p> </section> {% endblock %} {% block y %} <section> <h2>Section Y</h2> <p>…</p> </section> {% endblock %} {% block z %} <section> <h2>Section Z</h2> <p>…</p> </section> {% endblock %} {% endorderblocks %}
可通过 http://…/example/?顺序=z,y,x 或者可以使用 http://…/example/?顺序=y。
实施说明
当前实现的这个扩展通过替换 orderblocks用for循环标记,循环遍历 请求的块名,包括与请求的块匹配的块 名字。 换言之,它转换如下结构:
{% orderblocks block_order %} {% block x %} <p>X</p> {% endblock %} {% block y %} <p>Y</p> {% endblock %} {% endorderblocks %}
进入if块的for循环,例如:
{% for block_name in block_order %} {% if block_name == 'x' %} {% block x %} <p>X</p> {% endblock %} {% endif %} {% if block_name == 'y' %} {% block y %} <p>Y</p> {% endblock %} {% endif %} {% endfor %}
安装
可以使用setup.py脚本安装扩展:
python setup.py install
在此之前,您可能需要运行单元测试:
PYTHONPATH=lib python -m unittest discover
许可证
此程序是免费软件:您可以重新分发和/或修改 根据由 自由软件基金会,或者许可证的第3版,或者 (由您选择)任何更高版本。
这个程序的发布是希望它能有用, 但没有任何保证;甚至没有 适销性或适合某一特定目的的适销性。见 GNU通用公共许可证了解更多详细信息。
你应该收到GNU通用公共许可证的副本 还有这个节目。如果没有,请参见<;http://www.gnu.org/licenses/>;。