2012-06-18 73 views
0

最近我开始尝试使用Python和Django。我喜欢它,已经学会了很多,但还有很长的路要走...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. 是否有更智能的方法来编写这段逻辑。这个代码的问题在于它检查图像的名称。当我有多个同名的图像时,这可能会出错...

希望有人可以给出一些反馈意见,并指出我在正确的方向。

非常感谢!

亲切的问候

+0

嗨,命名问题解决方案:我可以使图像名称独特,使用此重命名技术:[Django FileField与upload_to确定在运行时](http://stackoverflow.com/questions/1190697/django-filefield-with-upload-to-determined-at -运行)。但仍然是第一点:如何循环播放不同的图像?这段代码是否是'智能'的意思,这是处理图片上传的最佳方式吗?谢谢! –

回答

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值。但是,假设每个循环都应该产生一个不同的对象来与该特定图像进行比较。

有一件事要考虑的是,你几乎不应该做一条毯子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: 
    ... 
+0

感谢您的反馈jdi。字符串的问题是我不能将它用于'details.image'。在代码中我实际上想要在两个地方使用同一个变量:'form.cleaned_data ['variable']'和'details.variable'。这可能以某种方式吗?谢谢! –

+0

@Köver:使用'getattr'。看我的编辑 – jdi

+0

太棒了!测试和工作!非常感谢jdi! –