如何在Django

时间:2015-07-16 09:57:59

标签: django

我有一个类似

的模型
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文件),虽然现在不需要。

1 个答案:

答案 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