1

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

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

4 回答 4

1

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

for article in articles if article.category == 'hotels' | sort(attribute='city')
于 2013-03-24T04:44:59.600 回答
0

如果您只想遍历酒店,请参阅Sean Vieira 的回答。如果您想遍历所有文章,但要对酒店进行排序,而其余的则以任意顺序排列,您可以使用来完成:

{% 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首先按所需顺序为每家酒店定义的所有内容,然后是每篇不是酒店的文章。

于 2013-03-24T05:46:46.590 回答
0

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

for article in articles|selectattr("city")|sort(attribute="city")
于 2018-10-08T14:32:35.473 回答
0

我在寻找类似解决方案时发现了这个页面。最终,我以不同的方式解决了它,它可能对其他人有帮助。

在我的 Pelican 模板之一中,我添加了“post_stats”插件收集的关于大致阅读时间的统计信息。看起来像

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

但是如果插件没有加载,那么“article”对象就没有“stats”属性并且渲染失败。

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

~{{ article.stats['read_mins'] if article.stats is defined else "0" }} min read
于 2017-05-04T15:38:55.133 回答