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))

记录器输出我希望看到的网址。在我的模板中,我只有:

<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 回答