How to clear this jinja2 and / or boolean expression

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

Another option I tried was to put two nested if statements in a loop to take care of these two filters, but then the nesting was big.

What is the most elegant?

+2
python filter jinja2 config webapp2
source share
1 answer

As John Case noted 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 in 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) 

expression takes the form:

 {% 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, for example in 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 shell (from webapp2_extras import jinja2) and this is a caching property in my base manipulator

 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(..) 
+4
source share

All Articles