1

假设我有一个Photo带有ImageField.

我试图迭代模板中的所有照片对象{% for photo in Photo.objects.all %}
什么都没有出现。

这是不可能的吗?

4

2 回答 2

6

执行此操作的通常方法是使用如下所示的视图:

def photo_view(request):
    return render_to_response('app_name/photos.html', {
        'photos': Photo.objects.all()
        })

然后模板(app_name/templates/app_name/photos.html在此示例中)具有以下内容:

{% for photo in photos %}

如果你真的想做{% for photo in Photo.objects.all %},那么你的视图代码必须Photo通过上下文传递:

def photo_view(request):
    return render_to_response('app_name/photos.html', {
        'Photo': Photo
        })

请记住,这并不是一种更好的方法,因为模板语法比 Python 更具限制性。比如模板中没有办法做{% for photo in Photo.objects.filter(...) %};过滤需要在视图中进行。

于 2012-05-07T05:41:52.193 回答
3

你可能想错了。

HTTP 请求被路由到视图。

视图执行任何业务逻辑(可能涉及通过 ORM 访问数据库),然后将任何所需的数据/对象作为上下文字典传递给模板系统。

模板系统只看到它从视图中传递的内容。如果对象是一个惰性求值的 ORM DB 迭代器,那么它肯定可以访问 DB。但是视图必须将该对象传递到模板的上下文中。

尝试{{Photo}}在您的模板中确保它实际上被传递了一个"Photo"由相应视图命名的对象。您可能需要检查生成的 html 的源代码(以防repr它使用尖括号做一些奇怪的事情,并且无法在浏览器中正确显示。)

于 2012-05-07T05:13:53.737 回答