【问题标题】:Flask threaded commentsFlask 线程注释
【发布时间】:2018-04-08 08:12:47
【问题描述】:

我想在 Flask 中显示嵌套的 cmets。我使用的是 MongoDb,我的文档结构是这样的:

{"_id":16,"content":"This is first answer.","discussion_id":1,
"posted":{"$date":"2017-10-26T19:19:05.174Z"}}
{"_id":17,"content":"This is second answer.","discussion_id":1,
"posted":{"$date":"2017-10-26T19:19:27.325Z"}}
{"_id":18,"content":"This is third answer.","discussion_id":1,
"posted":{"$date":"2017-10-26T19:20:00.126Z"}}
{"_id":19,"content":"This is fourth answer.  This answer's parent should be second.","discussion_id":1,
"posted":{"$date":"2017-10-26T19:21:28.206Z"},"parentid":2}
{"_id":20,"content":"Fifth answer whose parent should be fourth.","discussion_id":1,
"posted":{"$date":"2017-10-26T19:22:11.393Z"},"parentid":4}

测试python程序如下:

from flask import render_template
from flask import Flask
from flask_pymongo import PyMongo

app = Flask(__name__)
app.config['MONGO_DBNAME'] = 'programming'
app.config['MONGO_URI'] = 'mongodb://localhost:27017/programming'
app.config['JSON_AS_ASCII'] = False
mongo = PyMongo(app)

@app.route('/')
def index():
    table = mongo.db.comments

    commentList = table.find({'discussion_id' : 1})

    comments = []
    for comment in commentList:
        comments.append({'commentnumber' : comment['_id'], 'date' : comment['posted'], 'content' : comment['content']})
        result = mongo.db.comments.find_one( { '_id' : comment['_id'] , "parentid": { '$exists': True, '$ne': False } })
        if (result):
            comments.append({ 'parent' : comment['parentid'] })
            print("Parent comment ", comment['parentid'])

    return render_template('index.html', comments=comments)

if __name__ == "__main__":
    app.run(debug=True)

还有 jinja 模板我想递归地显示 cmets。

{%- for item in comments recursive %}
<li>{{ item.content }}</li>
{%- if item.children -%}
<ul class="children">{{ loop(item.children) }}</ul>
{%- endif %}</li>
{%- endfor %}

如何在 Jinja 中存储当前帖子的子项并递归显示嵌套的 cmets。

【问题讨论】:

    标签: python mongodb flask jinja2


    【解决方案1】:

    我在 Flask 网站的论坛上为我的游戏 Infinitroid 做了类似的事情,例如https://infinitroid.com/forum/posts/12

    我基本上所做的是,在服务器端,使用每个评论的父 ID 来确定一个整数 depth 或缩进级别:如果你按主键排序,那么后面的 cmets 会排在前面的后面,并且父母应该已经在名单上。因此,您可以为没有父级的 cmets 设置 depth = 0,为有父级的 cmets 设置 parent.depth + 1(使用临时字典进行查找)。

    将您的 CSS 设置为基于标签嵌套级别的缩进。然后,使用下面的算法进行显示。在我的例子中,我通过 javascript 显示 cmets(如果你好奇,你可以在该页面上查看源代码),但该算法在 Jinja 中也应该是可行的。

    从深度 = 0 开始。对于每条评论:

    • 如果删除一个深度级别,为每个删除的级别添加结束标签
    • 为此评论添加一个开始标签并增加深度级别
    • 显示评论正文
    • 在最后一条评论中,为任何剩余的深度级别添加结束标签

    您可以将其构建为“带退出的循环”循环,以避免重复关闭深度级别部分。

    【讨论】:

    • 那个链接现在失效了……你还有别的例子吗?
    • 很抱歉。目前没有另一个活生生的例子。
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    相关资源
    最近更新 更多