无法在视图中向模型添加额外信息

时间:2013-03-18 12:13:02

标签: python django django-views

我正在尝试在视图中向对象添加一些额外信息:

    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循环内。照片本身很好,但不是叠加。

我做错了什么?我该如何将这些额外信息添加到对象中?

1 个答案:

答案 0 :(得分: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))

应该可以在不对模板进行任何修改的情况下工作:)

<强>更新 我正在考虑另一个解决方案,可能更优雅,更确保更有效:为您的类添加 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

在这里,您不需要在视图中或模板中执行任何特殊操作!