0

ビュー内のオブジェクトに少し余分な情報を追加しようとしています:

    photos = gallery.photos
    for p in photos:
        try:
            extra_info = SomethingElse.objects.filter(photo=p)[0]
            p.overlay = extra_info.image
            logger.debug(p.overlay.url)
        except:
            logger.debug('overlay not found')
            p.overlay = None

    return render_to_response('account/site.html',
                          {'photos': photos},
                          context_instance=RequestContext(request))

ロガーは、私が期待する URL を出力します。私のテンプレートには次のものがあります。

<img src='{{ photo.overlay.url }}' alt='' />

forループ内。写真自体は問題なく表示されますが、オーバーレイは表示されません。

私は何を間違っていますか?この追加情報をオブジェクトに追加するにはどうすればよいですか?

4

1 に答える 1

1

写真はクエリセットだと思います。それを反復すると、djangoはデータを表すpythonオブジェクトを返します。そうすると、クエリセットp.overlay = extra_info.imageではなく、このpythonオブジェクトを変更するだけです。ループの最後で、クエリセットの結果が django によってキャッシュされるため、ローカルの変更はなくなります。

私がお勧めするのは、クエリセットの代わりに辞書のリストをテンプレートに渡すことです。何かのようなもの:

photos = gallery.photos
photo_list = []
for p in photos:
    new_photo = {}
    new_photo['url'] = p.url
    # [...] copy any other field you need
    try:
        extra_info = SomethingElse.objects.filter(photo=p)[0]
        new_photo['overlay'] = extra_info.image
    except:
        logger.debug('overlay not found')
        new_photo['overlay'] = None
   photo_list.append(new_photo)

return render_to_response('account/site.html',
                      {'photos': photo_list},
                      context_instance=RequestContext(request))

テンプレートを変更しなくても機能するはずです:)

更新: 私は別の解決策を考えています。おそらくもっとエレガントで、より効果的です:クラス Model にoverlay()関数を追加します:

class Photo(models.Model):
  [...]

  def overlay(self)
    try:
      extra_info = SomethingElse.objects.filter(photo=self)[0]
      return extra_info.image
    except:
      logger.debug('overlay not found')
      return None

ここでは、ビューやテンプレートで特別なことをする必要はありません!

于 2013-03-18T12:26:36.400 に答える