我已经搜索过网络,如果有解决方案,我还没有找到它。也许答案就在我面前,但我没有看到它,我对这个问题感到非常困惑。
问题:我有一个模特:
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
添加/更改表单。也许我应该,我们会看到。
当我提交新广告系列时,会上传xlsfile
和dealerimage
,并且应该是必需的。我在广告系列模型的重写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时刻:)
答案 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"])