Jinja2输出降价Frontmatter到列表

2024-05-14 14:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个降价文件文件夹。每个文件都包含一块YAML frontmatter。我试图将每个文件的frontmatter中的标题输出到一个Jinja2模板中,并在一个HTML文件中列出它们

我在没有Jinja2的情况下显示标题没有问题,但是当我试图输出到我的Jinja2模板时,它就崩溃了

下面是我正在处理的标记文件的一个示例,以及我试图列出的title:项:

---
title: Test
date: 2020-03-26
---

## Test Markdown

下面是我正在使用的Python代码。我正在使用python-frontmatter模块从每个降价帖子中提取frontmatter

使用frontmatter模块,选择标题并将其显示在终端上非常容易,但我无法使用Jinja2模板content.metadata是一条格言

import frontmatter
import jinja2
import glob

# Initialise Jinja2:
jinja2_env = jinja2.Environment(
    loader=jinja2.FileSystemLoader("templates"),
)

# Get list of posts:
posts = glob.glob("posts/*.md")

def build():

    with open("test.html", "w", encoding="utf-8") as index_file:
        for post in posts:
            content = frontmatter.load(post)

            # Prints titles to the terminal the way I want to output them in the Jinja template:
            print(content.metadata["title"])

            # Jinja output:
            template = jinja2_env.get_template("test.html.j2")
            rendered = template.render(frontmatter=content.metadata)
            index_file.write(rendered)

build()

我的Jinja2模板如下所示:

<ul>
{% for key, value in frontmatter.items() %}
    <li><a href="">{{ value.title() }}</a></li>
{% endfor %}
</ul>

这根本不起作用,我得到一个错误jinja2.exceptions.UndefinedError: 'datetime.datetime object' has no attribute 'title'。如果我删除.title(),那么创建的HTML文件最终会在DICT中循环,但会输出每个DICT的完整模板:

<ul>

    <li><a href="">Test Title 1</a></li>

    <li><a href="">2020-10-21 10:00:20</a></li>

</ul><ul>

    <li><a href="">Test Title 2</a></li>

    <li><a href="">2019-06-09 17:42:12</a></li>

</ul><ul>

    <li><a href="">Test Title 3</a></li>

    <li><a href="">2019-06-09 17:42:12</a></li>

</ul>

在这里,我的Python知识已经到了极限,因此任何关于解决这一问题的帮助都将是巨大的。最后我想要的是一个HTML文件,输出每个文件的标题,如下所示:

<ul>
    <li><a href="">Test Title 1</a></li>
    <li><a href="">Test Title 2</a></li>
    <li><a href="">Test Title 3</a></li>
</ul>

Tags: 文件test模板标题jinja2titletemplateli
1条回答
网友
1楼 · 发布于 2024-05-14 14:25:20
<ul>
{% for key, value in frontmatter.items() %}
    <li><a href="">{{ value.title() }}</a></li>
{% endfor %}
</ul>

这是错误的。正如错误消息所说,您正在对datetime对象调用title()(您的date前端事务)

您的循环正在前面的每个key(标题,然后是日期)以及value上迭代

<ul>
    <li><a href="">{{ frontmatter.title }}</a></li>
    <li>{{ frontmatter.date }}</li>
</ul>

当然,这只会向您显示一个源文件的标题,因为您将在每篇文章上循环,并将它们呈现为完全独立的模板:

for post in posts:

您希望呈现1模板,因此请删除对render()的调用周围的for循环,并将其传递给所有帖子:

rendered = template.render(
    posts=posts,
    posts_meta=[frontmatter.load(post).metadata for post in posts]
)

。。。并在模板中对其进行循环:

<ul>
{% post_meta in posts_meta %}
    <li><a href="">{{ post_meta.title }}</a></li>
{% endfor %}
</ul>

相关问题 更多 >

    热门问题