Reputation: 17203
{% 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?
Upvotes: 2
Views: 5490
Reputation: 17203
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(..)
Upvotes: 4