【问题标题】:Flask MongoEngine queryset in templates模板中的 Flask MongoEngine 查询集
【发布时间】:2013-05-08 21:19:41
【问题描述】:

我正在使用 Flask 和 mongoengine 构建一个小型应用程序。

简单来说,我有:

@app.route('/course/<slug>/', methods=['GET', 'POST'])
def course_detail(slug):
    course = Course.objects.get(slug=slug)


    return render_template(
        'course_detail.html',
        title='Course Detail -' + course.name,
        course=course,
   )

我想在模板中迭代这些数据,但如果我这样做:

{% for k, v in course %}{{ v }}{% endfor %}

我收到ValueError: too many values to unpack

我还想对这些值求和:

{{ course.values()|sum }}

这样我得到:

UndefinedError: 'flask_mongoengine.BaseQuerySet object' has no attribute 'values'

那么我应该如何使用 mongoengine 遍历 Flask 中的查询集?

【问题讨论】:

    标签: flask jinja2 mongoengine


    【解决方案1】:

    Course.objects.get(slug=slug) 返回不是dictionary 的文档。 因此,要获取所有对象字段,只需使用:

    {% for field in course %}{{ course[field] }}{% endfor %}
    

    BaseDocument.__iter__() 返回字段名称,您在 jinja2 中使用 course[field] 获取值。

    但如果您没有 MultipleObjectsReturnedDoesNotExist 异常处理程序,我建议您使用 Course.objects(slug=slug).first() 而不是 Course.objects.get(slug=slug)

    您不能使用 sum 过滤器,因为它使用内置 sum 函数,它使用可迭代的数字,但 BaseDocument.__iter__() 返回字段名称。 所以你可以:

    1. 获取总和并将其传递给模板。
    2. 编写自己的 jinja2 过滤器;
    3. 为您的文档定义添加特殊方法,该方法将返回字段总和;
    4. 为您的文档定义添加特殊方法,该方法将返回数字字段列表并使用sum 过滤器;

    如果您想获取课程的可迭代对象,请使用 Course.objects(slug=slug)

    【讨论】:

    • 谢谢!随着我熟悉 Flask 和 MongoEngine,您在这里提供了很多信息供我探索。非常有用。
    猜你喜欢
    • 2012-12-09
    • 2014-08-16
    • 2015-07-16
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多