2012-05-07 55 views
1

假设我有一个模型PhotoImageField我可以从django模板访问数据库吗?

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

这是不可能的吗?

+0

请显示您的观点代码。正如Preet所说,模板不能直接访问模型;他们只能得到上下文以及任何中间件增加的内容。 –

回答

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(...) %};过滤需要在视图中发生。

3

您可能正在考虑错误的方式。

HTTP请求被路由到一个视图。

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

模板系统只能看到它从视图中传递过来的内容。如果对象是懒惰评估的ORM数据库迭代器,那么当然可以访问数据库。但视图必须将该对象传递到模板的上下文中。

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

相关问题