2012-05-07 12 views
1

ImageFieldのモデルPhotoがあるとします。djangoテンプレートからDBにアクセスできますか?

テンプレート内のすべての写真オブジェクトを{% for photo in Photo.objects.all %}で反復しようとしました。
何も表示されません。

これは不可能ですか?

+0

ビューのコードを表示してください。 Preetによると、テンプレートはモデルに直接アクセスすることはできません。コンテキストに加えてミドルウェアが追加するものだけを取得します。 –

答えて

5

これは通常の方法です。本当に場合

{% for photo in photos %} 

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

そして、(この例ではapp_name/templates/app_name/photos.html中)のテンプレートのようなものがありますのようなものが見えますその後、あなたのビューコードは、コンテキスト経由Photoを渡す必要があり、{% for photo in Photo.objects.all %}をしたい:

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

ベア心​​の中でテンプレートの構文は、Pythonよりも多くの制限があり、これは、実際にそれを実行する方法の任意のより良いではないこと。たとえば、テンプレートに{% for photo in Photo.objects.filter(...) %}を実行する方法はありません。フィルタリングはビュー内で実行する必要があります。

3

あなたは間違った方法を考えているかもしれません。

HTTP要求がビューにルーティングされます。

ビューはビジネスロジック(ORMを介してDBにアクセスする可能性があります)を実行し、必要なデータ/オブジェクトをコンテキストディクショナリとしてテンプレートシステムに渡します。

テンプレートシステムでは、ビューから渡されたものだけが表示されます。オブジェクトが遅れて評価されたORM DBイテレータであれば、確かにDBにアクセスできます。しかし、ビューはそのオブジェクトをテンプレートのコンテキストに渡す必要があります。

{{Photo}}をテンプレートに試して、対応するビューで実際に"Photo"という名前のオブジェクトが渡されていることを確認してください。生成されたhtmlのソースを調べる必要があるかもしれません(reprのため、山括弧で変わってブラウザに正しく表示されません)。

関連する問題