我有一个类似
的模型class InfoFromFile(models.Model):
name = models.CharField()
title = models.CharField(max_length=200)
date_from_file = models.DateField()
file = models.FileField()
file_hash = models.CharField(unique=True)
使用相应的管理类
class InfoFromFileAdmin(admin.ModelAdmin):
fieldsets = [
('Information source', {'fields': ['File']}),
]
def save_model(self, request, obj, form, change):
# custom action here to extract info from file
# before creating and saving the model
我有一个单独的函数来创建文件的哈希值。
因此,表单中唯一的输入字段是文件上传。我希望防止重复文件上传,也就是说,在将模型保存为表单/模型验证的一部分之前。如果尝试保存模型并且哈希已存在,则抛出IntegrityError。
我知道Model.validate_unique()方法,但我不知道如何在ModelAdmin.save_model(*)方法中应用它。
总结一下,我的问题是:
如何在与模型表单提供的字段不同的字段中验证唯一性?
我应该在admin-user点击保存按钮之前使用javascript创建文件的哈希值吗?或者使用任何其他隐藏的字段?
编辑:该网站未来的扩展将允许用户上传此类文件(或执行相同的处理,从而产生输出pdf文件,可能无需保存用户' s文件),虽然现在不需要。
答案 0 :(得分:1)
我认为您需要的是自定义表单。您可以在表单的clean_<field>
方法中验证您想要的任何内容。它应该类似于:
class InfoFromFileForm(ModelForm):
def clean_File(self):
file_obj = self.cleaned_data['File']
hash = get_hash() # whatever you use to get file hash
if InfoFromFile.objects.filter(file_hash=hash).exists():
raise ValidationError(_("The hash must be unique.")
return file_obj
然后在您的管理类
中class InfoFromFileAdmin(admin.ModelAdmin):
# your things
form = InfoFromFileForm
# more things