2017-10-16 56 views
0

Django 1.11.6校验和计算表格验证后:如何通知用户有错误

我正在开发文档存档。所以,我计算校验和以控制文档仍然存在,它们没有损坏等。

另一方面是我可以控制文件是否已经上传。重要的是:不需要复制文件。

我通过Django admin上传文件。有一张表格准备好了。 但问题是:表单验证器在这里似乎不是很有用。 至少我不能发明如何在这里使用表单验证器。

但post_save信号很有用:在这里我们有一个文件已经上传。我们计算文件的校验和(使用md5)。

但是,如果unique = True表示校验和,则IntegrityError升高。

这是好的和可预测的。但是,你能帮我理解如何通知用户吗?任何方法都可以。这仅仅是我们的员工:不需要组织一个精彩的html布局。但重要的是要显示上传的文件与具有以下id的现有文件一致。

你能帮我解决吗?

models.py

class FileChecksum(models.Model): 

    checksum = models.CharField(blank=True, 
           null=False, 
           unique=True, 
           max_length=255, 
           verbose_name=_("checksum")) 

    def __str__(self): 
     return self.checksum 



class Image(models.Model): 
    file = models.ImageField(blank=False, 
            verbose_name=_("Image"), 
            max_length=255, 
            upload_to=get_sheet_path) 

    file_checksum = models.OneToOneField(FileChecksum, 
            blank=True, 
            null=True) 

    @property 
    def checksum(self): 
     pass  

    @checksum.setter 
    def checksum(self, new_checksum): 
     pass 

signals.py

@receiver(post_save, sender=Image) 
def save_file_checksum(sender, instance, **kwargs): 
    new_checksum = get_checksum(instance.file.path) 
    instance.checksum = new_checksum 

admin.py

class ImageForm(FileMixin, 
       ModelForm): 
    model = Image 


class ImageAdmin(admin.ModelAdmin): 
    form = ImageForm 

admin.site.register(Image, ImageAdmin) 
+0

也许你可以尝试使用电子邮件通知? – neverwalkaloner

+0

有时需要几分钟才能发送电子邮件。那么,延迟发生。分钟可以总结为几个小时。而且根本不能保证邮件的传递。这不是笨拙吗?用户可能不喜欢它。 – Michael

回答

0

你必须在之前计算它你保存。这样,您的表单可以从中受益,并且表单验证将负责将错误冒泡给用户。从信号中去耦get_checksum函数,并将其计算为表单验证的一部分。

我有相同的情况,我有一个非平凡的哈希计算。因此,只要所有其他基本验证工作完成,我就用函数计算has,如果它发生冲突,则将它作为表单(不变式)验证的一部分。如果它没有冲突,它就会用于即将创建的实例。

但我也是这样做的,如果您尝试创建模型的实例,但没有哈希集合,则会产生一个pre_save信号。用于代码路径,其中项目不是从常规窗体进入的。