如何清理这个jinja2和/或布尔表达式 [英] how to clean up this jinja2 and/or boolean expression

查看:213
本文介绍了如何清理这个jinja2和/或布尔表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果((不是file_name_filter)或blog_dict)排序(reverse = True,attribute ='date'),则可以使用

  {%block content%} 
{文件名== file_name_filter)和((not category_filter)or blog_dict.category == category_filter)%}

{{blog_dict.date.strftime(%Y-%m-%d)}}
< a href =/ posts / {{blog_dict.filename}}>< H1> {{blog_dict.heading}}< / H1>< / A>
<! - 将此标记放置在您想要呈现+1按钮的位置 - >
< div class =g-plusonedata-href =/ posts / {{blog_dict.filename}}>< / div>
{{blog_dict.post | safe}}
< / div>
< br />
< br />
< br />
< img src =/ images / page_divider.gif>< br />
{%endfor%}
{%endblock%}

看到表达式变得乱七八糟:

  {blog for blog_dict in blogs | sort(reverse = True,attribute ='date')如果((不是file_name_filter)或blog_dict.filename == file_name_filter)和((不是category_filter)或blog_dict.category == category_filter)%} 

我试过的另一个选择是把两个嵌套的if语句放在循环中来照顾两个过滤器,但是嵌套变得很大。

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


$ b $

  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)
如果category_filter:
blogs =(d为博客中的d,如果d ['category'] == category_filter)
return博客

这是添加到jinja2 environment.filters字典中的

  myconfig = {} 
myconfig ['webapp2_extras.jinja2'] = {'template_path':['templates','blog_posts'],
' filter':{'blog_filter':blog_filter}}
$ b app = webapp2.WSGIApplication(_routes,
debug = True,
config = myconfig)


$ b

表达式变成:

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

我也可以在其他地方使用这个过滤器,比如我的菜单:

pre $ {%for month ,博客blog_dicts | blog_filter(False,category_filter)| groupby('date.month')| sort(reverse = True,attribute ='grouper')%}

注意我使用jinja2 wrapper(从webapp2_extras import jinja2)
它是我的basehandler中的一个缓存属性



$ p $ class BaseHandler(webapp2.RequestHandler):
@ webapp2.cached_property
def jinja2(self):
return jinja2.get_jinja2(app = self.app)
$ b def render_template(self,filename,** kwargs):
#call self.response.write(self.jinja2.render_template(..)


{% 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 %}

As you can see the expression is getting messy:

{% 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) %}

The other option I tried was putting two nested if statements in the loop to take care of the two filters, but then nesting got large.

what is the most elegant?

解决方案

As John Keyes mentioned in the comments, I added a filter:

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

this is added to jinja2 environment.filters dict

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

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

the expression becomes:

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

I was also able to use this filter elsewhere such as my side menu:

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

Note I use the jinja2 wrapper (from webapp2_extras import jinja2) and it is a cached property in my basehandler

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(..)

这篇关于如何清理这个jinja2和/或布尔表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆