python - 如何清理这个 jinja2 和/或 bool 表达式

标签 python filter config jinja2 webapp2

{% block content %}
    {% for blog_dict in blogs|sort(reverse=True,attribute='date') if ((not file_name_filter) or blog_dict.filename==file_name_filter) and ((not category_filter) or blog_dict.category==category_filter) %}
        <div id="post{{blog_dict.post_number}}-{{blog_dict.link_name}}">
            {{blog_dict.date.strftime("%Y-%m-%d")}}
            <a href="/posts/{{blog_dict.filename}}"><h1>{{blog_dict.heading}}</h1></a>
            <!-- Place this tag where you want the +1 button to render -->
            <div class="g-plusone" data-href="/posts/{{blog_dict.filename}}"></div>
            {{blog_dict.post|safe}}
        </div>
        <br />
        <br />
        <br />
        <img src="/images/page_divider.gif"><br />
    {% endfor %}
{% endblock %}

正如你所看到的,表达式变得越来越困惑:

{% for blog_dict in blogs|sort(reverse=True,attribute='date') if ((not file_name_filter) or blog_dict.filename==file_name_filter) and ((not category_filter) or blog_dict.category==category_filter) %}

我尝试的另一个选项是在循环中放置两个嵌套的 if 语句来处理两个过滤器,但随后嵌套变得很大。

什么是最优雅的?

最佳答案

正如 John Keyes 在评论中提到的,我添加了一个过滤器:

def blog_filter(blogs, file_name_filter, category_filter):
    if file_name_filter:
        blogs = (d for d in blogs if d['filename'] == file_name_filter)
    if category_filter:
        blogs = (d for d in blogs if d['category'] == category_filter)
    return blogs

这已添加到 jinja2environment.filters 字典中

myconfig = {}
myconfig['webapp2_extras.jinja2'] =  {'template_path': ['templates','blog_posts'],
                                      'filters': {'blog_filter': blog_filter}}

app = webapp2.WSGIApplication(_routes,
    debug=True,
    config = myconfig)

表达式变为:

{% for blog_dict in blogs|blog_filter(file_name_filter,category_filter)|sort(reverse=True,attribute='date') %}

我还可以在其他地方使用此过滤器,例如我的侧面菜单:

{% for month, blog_dicts in blogs|blog_filter(False, category_filter)|groupby('date.month')|sort(reverse=True,attribute='grouper') %}

注意我使用 jinja2 包装器(from webapp2_extras import jinja2) 它是我的基本处理程序中的缓存属性

class BaseHandler(webapp2.RequestHandler):
    @webapp2.cached_property
    def jinja2(self):
        return jinja2.get_jinja2(app=self.app)

    def render_template(self, filename, **kwargs):
        #call self.response.write(self.jinja2.render_template(..)

关于python - 如何清理这个 jinja2 和/或 bool 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406939/

相关文章:

python - 从 pandas 数据框中的变量中提取数值

python - Apache 2.4 无法在 Yosemite 上加载 mod_wsgi.so

c++ - 在 opencv 中创建晕影过滤器?

iphone - 加速度计相对位置

c# - 控制台应用程序的多个配置文件

python - 部署 Django : How do you do it?

python - 获取装饰类方法的类名

android - 在图像上应用滤镜时 Android 应用程序中的 java.lang.RuntimeException : Applying effect in wrong GL context!

python - 从 Python 测试 Apache 配置文件

config - 为fish shell指定不同的配置文件