0

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

我制作了一个包含 5 个图像字段的模型。在模型旁边,我还制作了一个表格来输入数据并保存它。到目前为止,一切都很好。现在我想写另一个表格来“编辑”上传的图片,意思是:

  1. 上传新图片
  2. 从数据库中删除“旧”图像

我编写了下面的代码来完成 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. 有没有更智能的方法来编写这段逻辑。我对这段代码的一个问题是它检查图像的名称。当我有多个具有相同名称的图像时,这可能会出错......

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

非常感谢!

亲切的问候

4

1 回答 1

1

您需要使用字符串:

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:
    ...
于 2012-06-19T21:35:12.810 回答