2017-10-16 54 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信號。用於代碼路徑,其中項目不是從常規窗體進入的。