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, &hellip;</li>
            </ul>
        {% endblock %}

        {% block story %}
            <p>Article story goes here &hellip;</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>&hellip;</p>
        </section>
    {% endblock %}

    {% block y %}
        <section>
            <h2>Section Y</h2>
            <p>&hellip;</p>
        </section>
    {% endblock %}

    {% block z %}
        <section>
            <h2>Section Z</h2>
            <p>&hellip;</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/>;。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在IntelliJ社区版中为maven项目创建war文件?   架构在java编程中创建模型数据的最佳方式   java代码可以打印当前数字右边的最大数字,最后一个数字应该打印1   java上一个和下一个按钮,用于在WebView中从数组中加载字符串   java与直接DB调用/RESTful服务调用相比,测试Hazelcast数据检索速度的最佳方法是什么?   资源/类链接上的Java404   java如何安装play2War插件(Play Framework 2.1.1.)   多线程守护进程线程行为java   java如何从RepainManager生成异常   java Hibernate集合映射问题。无法删除或更新父行:外键约束失败   java LibGDX TextureRegion NullPointerException   java无法在JUnit套件中添加测试类   java通配符捕获/泛型   awt如何在Java中获取当前的鼠标指针类型?   java将probuf转换为POJO   java bouncycastle是否支持RSA PKCS1OAEP填充?   SQLiteDatabase的java问题。SQLITE数据库时的查询()。rawQuery()工作正常   java Android。如何正确存储数据库的数据?   java如何访问与GAE默认服务帐户关联的电子邮件地址?