Django - for循环与变量字段名称

时间:2012-06-18 21:53:59

标签: python django image for-loop django-forms

最近我开始尝试使用Python和Django。我喜欢它,已经学到了很多,但还有很长的路要走......

我制作了一个包含5个图像字段的模型。在模型旁边,我还制作了一个输入数据并保存的表格。到现在为止还挺好。 现在我想写另一个表单来“编辑”上传的图像,这意味着:

  1. 上传新图片
  2. 从数据库中删除“旧”图像
  3. 我编写了下面的代码来完成1张图片的工作:

    if form.is_valid():
                form_image = form.cleaned_data['image_1']
                try:
                    details = Model.objects.get(pk=pk)
                    if details.image_1 != form_image:
                        details.image_1.delete(save=False)
                except: pass # when new photo then we do nothing, normal case
                form.save()
    

    但我正在努力解决以下问题:

    1. 如何重写此代码以更新5个图像字段?因为在最坏的情况下,可以编辑所有5个图像字段。我试过'for循环'但从未成功。例如:

      image_list = [image_1, image_2, image_3, image_4, image_5]
      if form.is_valid():
          for image in image_list:
              form_image = form.cleaned_data[image]
              try:
                  details = Model.objects.get(pk=pk)
                  if details.image != form_image:
                      details.image.delete(save=False)
              except: pass # when new photo then we do nothing, normal case
              form.save()
      
    2. 是否有更智能的方法来编写这条逻辑。我对此代码的一个问题是它检查图像的名称。当我有多个具有相同名称的图像时,这可能会出错...

    3. 希望有人可以提供一些反馈并再次指出我正确的方向。

      非常感谢!

      亲切的问候

1 个答案:

答案 0 :(得分:0)

您需要使用字符串:

image_list = ['image_1', 'image_2', 'image_3', 'image_4', 'image_5']

# or doing that dynamically as well:
image_list = ['image_%d' % i for i in xrange(1,6)]

此外,从您的示例中,我不确定您每次都会获得唯一pk值。但是假设每个循环应该生成一个不同的details对象来与特定图像进行比较。

要考虑的一件事是你几乎不应该做毯子try, except: pass。它可以轻松掩盖您未考虑的错误:

try:
    details = Model.objects.get(pk=pk)
    ...
# django models have a special exception type
# when they don't exist.
except Model.DoesNotExist: 
    pass 

为了动态地将这些字符串名称用作变量查找,您只需使用getattr

for image_name in image_list:
    ...
    # equiv to: details.image_1, details.image_2, ...
    if getattr(details, image_name, None) != form_image:
    ...