如何访问Jina2模板中的特定字典元素?

时间:2017-05-31 16:01:20

标签: python jinja2 pelican

我在python配置文件中定义了以下字典:

char*

我有以下Jinja2模板:

AUTHORS = {
    u'MyName Here': {
        u'blurb': """ blurb about author""",
        u'friendly_name': "Friendly Name",
        u'url': 'http://example.com'
    }
}

我通过以下方式致电:

{% macro article_author(article) %}
    {{ article.author }}
    {{ AUTHORS }}
    {% if article.author %}
        <a itemprop="url" href="{{ AUTHORS[article.author]['url'] }}" rel="author"><span itemprop="name">{{ AUTHORS[article.author]['friendly_name'] }}</span></a> -
        {{ AUTHORS[article.author]['blurb'] }}
    {% endif %}
{% endmacro %}

当我生成Pelican模板时,我收到以下错误:

<div itemprop="author creator" itemscope itemtype="http://schema.org/Person">
    {% from '_includes/article_author.html' import article_author with context %}
    {{ article_author(article) }}
</div>

如果我从模板中删除CRITICAL: UndefinedError: dict object has no element <Author u'MyName Here'> 块,则会正确生成页面,并正确显示{% if article.author %}变量。它显然有一个{{ AUTHORS }}键:

MyName Here

如何在模板中正确访问<div itemprop="author creator" itemscope itemtype="http://schema.org/Person"> MyName Here {u'MyName Here': {u'url': u'http://example.com', u'friendly_name': u'Friendly Name', u'blurb': u' blurb about author'}} </div> 元素?

1 个答案:

答案 0 :(得分:1)

article.author不仅仅是'Your Name',而且an Author instance具有各种属性。在您的情况下,您想要:

{% if article.author %}
    <a itemprop="url" href="{{ AUTHORS[article.author.name].url }}" rel="author">
        <span itemprop="name">{{ AUTHORS[article.author.name].friendly_name }}</span>
    </a> -
    {{ AUTHORS[article.author.name].blurb }}
{% endif %}

或者,为了减少一些样板,你可以使用:

{% if article.author %}
    {% with author = AUTHORS[article.author.name] %}
        <a itemprop="url" href="{{ author.url }}" rel="author">
            <span itemprop="name">{{ author.friendly_name }}</span>
        </a> -
        {{ author.blurb }}
    {% endwith %}
{% endif %}

只要您的'jinja2.ext.with_' JINJA_ENVIRONMENT列表中有extensions

请注意,您可以在Jinja模板中使用dot.notation而不是index['notation']