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