我可以从django模板访问数据库吗?

时间:2012-05-07 05:05:19

标签: database django templates

假设我的模型Photo带有ImageField

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

这不可能吗?

2 个答案:

答案 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,它会使用尖括号做一些奇怪的事情,并且无法在浏览器中正确显示。)