在模板中包含具有类似视图逻辑的片段

时间:2017-05-16 14:39:58

标签: flask flask-flatpages

我正在建立一个带有烧瓶平面的博客。在markdown blogpost的标题中,我按文件名列出了相关的博文。这些应该显示为实际博客文章下面的摘录。

以下是blogpost-1.md的样子:

LineReader.on('close', function(){
    var chunkData = chunk(5000, number_list);
    async.eachSeries(chunkData, function(chunk, callback) {
        console.log(chunk.length);
        setTimeout(function() {
            callback(null);
        }, 5000);
    })
});

我想要的结果:

title: "Blogpost one"
published: 2014-02-13
related:
    - blogpost-2.md
    - blogpost-4.md
description: "This is the excerpt of blogpost one."

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
vel leo turpis. Cras vulputate mattis dignissim. Aliquam eget
purus purus.

关键部分是遵循相关博客文章的路径并呈现其标题和例外。天真地像:

BLOGPOST ONE

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vel
leo turpis. Cras vulputate mattis dignissim. Aliquam eget purus purus.

related posts:

BLOGPOST TWO
Summary here

BLOGPOST THREE
Also a summary

这显然不起作用,因为{% for item in blog.meta.related %} <div> <h4>{{ item.title }}</h4> <p>{{ item.decription</p> </div> {% endfor %} 只是一个字符串列表。制作一个带有这些字符串并返回httpResponse的视图函数也不难:

meta.related

我的问题:如何在同一个模板中实现这一目标?

我是否应该以某种方式尝试将相关博客文章中的数据传递到上下文中:可能是一系列文字?我应该使用上下文处理器来实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

Hei Roy,谢谢你的研究,但目前我无法评论,所以我必须找到一种方法来澄清这一点。

为了使其正常工作,请在markdown文件中写道:

title: "Blogpost one"
published: 2014-02-13
related:
- blogpost-2.md
- blogpost-4.md
description: "This is the excerpt of blogpost one."

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
vel leo turpis. Cras vulputate mattis dignissim. Aliquam eget
purus purus.

需要更改 blogpost-2.md和blogpost-4.md ,不带.md 扩展名。 在循环查看文件时没有这些更改:

for path in blog.meta['related']:
        related_list.append(blogs.get_or_404(path))

blogpost-1 / 2.md 将不会添加到您的列表中,因为Flask-FlatPages不会理解.md扩展名并且会出现404错误。

就我而言

@app.route('/blog/<path:path>.html')
如果没有像.html那样更改

@site.route('/bloging/<path:path>/')

简化一些编码,在模板中

{{ related.meta.title }}

相当于

{{ related.title }}

您可以使用以下链接添加相关文章的链接:

<a href="{{ url_for('site.bloging', path=related.path) }}">{{ related.title }}</a>

网站是我的蓝图。

答案 1 :(得分:0)

我得到了一个非常直截了当的答案,但保持问题是开放的,看看是否有更优雅的解决方案。

在视图函数中,我迭代相关博客帖子的路径,并将博客对象添加到列表中,然后传递给模板。

像这样:

@app.route('/blog/<path:path>.html')
def blog_detail(path):
    blog = blogs.get_or_404(path)
    related_list = []
    for path in blog.meta['related']:
        related_list.append(blogs.get_or_404(path))
    return render_template('blog-detail.html', blog=blog, related_list=related_list)

在模板中:

{% for related in related_list %}
    hoi
    <div>
        <h4>{{ related.meta.title }}</h4>
        <p>{{ related.meta.description }}</p>
    </div>
{% endfor %}