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