最近我开始尝试使用Python和Django。我喜欢它,已经学到了很多,但还有很长的路要走......
我制作了一个包含5个图像字段的模型。在模型旁边,我还制作了一个输入数据并保存的表格。到现在为止还挺好。 现在我想写另一个表单来“编辑”上传的图像,这意味着:
我编写了下面的代码来完成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()
但我正在努力解决以下问题:
如何重写此代码以更新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()
是否有更智能的方法来编写这条逻辑。我对此代码的一个问题是它检查图像的名称。当我有多个具有相同名称的图像时,这可能会出错...
希望有人可以提供一些反馈并再次指出我正确的方向。
非常感谢!
亲切的问候
答案 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:
...