0

我正在用 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 中的查询集呢?

4

1 回答 1

1

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

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

BaseDocument.__iter__()返回字段名称,您可以在 jinja2 中使用course[field].

但如果你没有异常处理程序,我建议你改用Course.objects(slug=slug).first()Course.objects.get(slug=slug)MultipleObjectsReturnedDoesNotExist

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

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

如果您想获得课程的可迭代对象,则只需使用Course.objects(slug=slug).

于 2013-05-09T18:40:15.937 回答