假设我有一个Photo
带有ImageField
.
我试图迭代模板中的所有照片对象{% for photo in Photo.objects.all %}
。
什么都没有出现。
这是不可能的吗?
执行此操作的通常方法是使用如下所示的视图:
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(...) %}
;过滤需要在视图中进行。
你可能想错了。
HTTP 请求被路由到视图。
视图执行任何业务逻辑(可能涉及通过 ORM 访问数据库),然后将任何所需的数据/对象作为上下文字典传递给模板系统。
模板系统只看到它从视图中传递的内容。如果对象是一个惰性求值的 ORM DB 迭代器,那么它肯定可以访问 DB。但是视图必须将该对象传递到模板的上下文中。
尝试{{Photo}}
在您的模板中确保它实际上被传递了一个"Photo"
由相应视图命名的对象。您可能需要检查生成的 html 的源代码(以防repr
它使用尖括号做一些奇怪的事情,并且无法在浏览器中正确显示。)