当属性不可用时在jinja2中排序

时间:2013-03-24 04:40:23

标签: python jinja2

我有一组文章(使用pelican生成静态网站),其中包含一个名为hotels的类别。我想对这些酒店进行排序。问题是只有酒店有一个名为“城市”的属性而其他文章没有,这显然会导致以下错误:

Caught exception "'pelican.contents.Article object' has no attribute 'city'".

以下是我正在使用的代码:

{% for article in articles|sort(attribute='city') %}
{% if article.category == 'hotels' %}
    <a href="hotels/{{ article.slug }}.html">
    <p>{{ article.title }}</p>
    </a>
{% endif %}
{% endfor %}

有没有办法检查属性是否存在并提供一些默认值以便它不会导致错误?

4 个答案:

答案 0 :(得分:1)

您可以将if语句移动到for循环中作为过滤器:

for article in articles if article.category == 'hotels' | sort(attribute='city')

答案 1 :(得分:0)

如果您想重复 酒店,请参阅Sean Vieira's answer。如果您要迭代所有文章,但要对酒店进行排序,而其他文章是按任意顺序排序的,则可以使用macros来完成:

{% macro my_macro(article) %}
    ...
{% endmacro %}

{% for a in articles if a.category == 'hotels' | sort(attribute='city') %}
    {{ my_macro(a) }}
{% endfor %}

{% for a in articles if a.category != 'hotels' %}
    {{ my_macro(a) }}
{% endfor %}

这将包括您在my_macro中为每个酒店首先按所需顺序定义的所有内容,然后是每个非酒店的文章。

答案 2 :(得分:0)

我在寻找类似解决方案的时候找到了这个页面。 最终,我解决了一些不同的问题,这可能对其他人有所帮助。

在我的一个Pelican模板中,我添加了由post_stats&#39;收集的统计信息。关于大致阅读时间的插件。看起来像是

~{{ article.stats['read_mins']|default("0") }} min read

但是如果插件没有加载,那么“&#39;文章”#39;对象没有&#39;统计数据&#39;属性和渲染失败。

Jinja有内置测试,用于测试是否定义了变量。 所以,我提出了这个解决方案

~{{ article.stats['read_mins'] if article.stats is defined else "0" }} min read

答案 3 :(得分:0)

如果您只想显示具有'city'属性且该列表按'city'排序的条目,请执行以下操作:

for article in articles|selectattr("city")|sort(attribute="city")