Django Forms:不要在编辑时上传新文件。条件逻辑

时间:2016-07-01 15:35:04

标签: django forms

我已经搜索过网络,如果有解决方案,我还没有找到它。也许答案就在我面前,但我没有看到它,我对这个问题感到非常困惑。

问题:我有一个模特:

class Campaign(models.Model):

    emailaddress = models.CharField(max_length=100, default='', verbose_name='ADF Email', blank=True)
    xlsfile = models.FileField(upload_to='xlsfiles/', blank=True, null=True)
    created = models.DateTimeField(auto_now_add=True)
    dealerimage = models.ForeignKey('vipapp.savedImage', blank=True, null=True, related_name='campaign') 

我目前不会覆盖admin添加/更改表单。也许我应该,我们会看到。

当我提交新广告系列时,会上传xlsfiledealerimage,并且应该是必需的。我在广告系列模型的重写self.xlsfile中使用if {save()):来检查可选的xlsfile,如果它存在,我有相当数量的代码来解析{{1将记录放入另一个名为xlsfile的模型中,并向用户发送一个修改过的excel文件(我正在使用 xlsfile excel文件命名在这篇文章中)。

问题是:当用户使用默认的weblist更改表格修改广告系列时,excel文件会列在admin字段中。在提交时,系统似乎再次尝试上载excel文件,并且该文件可能不再存在于用户正在编辑的系统上。在编辑时,用户可能不想上传新的Excel文件,因为这会覆盖其他模型(xlsfile)。

问题:如何在更改表单中清除此字段,但在用户提交时不将其从对象中删除?我不能使用exclude,因为用户可能想要上传新的excel文件。

问题:广告系列模型weblist中的self.xlsfile是什么?我的意思是,如何区分数据库中的内容(可能是save())与更改形式obj.xlsfile中的内容之间的区别?帖子POST中的新数据是否已存在?我知道我应该能够自己确定这些事情,但是我无法可靠地判断我的测试是否正确,以便给出正确答案。

如何在表单加载时有效清除字段?用户可能想要替换self.xlsfile,因此删除xls记录,但这不是典型的。替换weblist模型中的weblist实例是危险,因为这些实例包含已生成的代码,这些代码已经发送给客户,因此很少发生这种情况,因此如果没有新的Excel文件不应触及weblist个实例。如果用户确实上传了新的Excel文件,则应删除并重写当前的weblist实例。

编辑表单上的

排除不是一个选项,因为有时可能需要更新weblist,但这种情况很少见。我不想删除任何内容,但我不希望表单显示xlsfile文件或进行任何更改,除非用户明确上传新的xls。我可能在这里重复了一遍,但我只是想明确一点。

我怀疑这里的答案会影响xlsfile字段,因为我可能会更好地理解这一点。这里的任何解释性信息都很棒。此外,为我提供指向使用表单表单API 表单和字段验证页面的链接可能无益,因为我已阅读这些文档。然而,指向我可能在这些页面中遗漏的确切答案可能会提供一个Ah-ha时刻:)

1 个答案:

答案 0 :(得分:0)

我想出来了......

我只是覆盖了get_form,以便在加载CampaignEditForm时xlsfile字段总是设置为空白:

def get_form(self, request, obj=None, **kwargs):
    if obj:
        obj.xlsfile = ''
        kwargs['form'] = CampaignEditForm
    else:
        kwargs['form'] = CampaignAddForm

    return super(campaignAdmin, self).get_form(request, obj, **kwargs)

然后在我的广告系列模型的save()中,我只是显式设置了我想要保存的字段,如果它是空白则省略xlsfile,因此除非替换它,否则DB中的任何值都不会被删除:

if self.xlsfile:
    super(Campaign, self).save(*args,**kwargs)
else:
    super(Campaign, self).save(update_fields=["dealername", "campaignname", "dealeraddress", "dealercity",
                                              "dealerstate", "dealerzipcode", "dealerphone", "dealeremail1",
                                              "dealeremail2", "dealeremail3", "dealeremail4", "dealeremail5",
                                              "adf", "adfemail", "created", "dealerimage"])