我的系統產品,與他們有聯繫,像這樣的圖片:訪問中的ModelForm上傳的文件清理()
class Product(models.Model):
name = models.CharField(max_length=100)
...
class Image(models.Model):
product = models.ForeignKey(Product)
image = models.ImageField(upload_to='products')
到目前爲止好。當然,客戶希望以csv批量上傳他們的產品並上傳包含圖像的zip文件。我格式化CSV像這樣:
product_name,image_1.jpg,image_2.jpg,...
product_2,image.jpg,...
到目前爲止,我已經做了一個模型只是作爲輔助:
class BulkUpload(models.Model):
csv = models.FileField(upload_to='tmp')
img_zip = models.FileField(upload_to='tmp')
的工作流程是這樣的:
- 用戶上傳文件通過django管理員
- 獲取zip文件內容並在以後存儲
- 解壓縮zip int o tmp目錄
- 開始一個事務。如果有什麼意外從這裏情況下,我們回滾
- 對於每一行的CSV
- 創建並保存產品與第一列指定的名稱。
- 從其他CSV字段
- 檢查圖像抓取圖像文件名是在壓縮,否則回滾
- 檢查圖像不存在目標目錄,否則回滾
- 移動圖像到目標目錄並將fk設置爲已保存的產品對象,並回滾任何錯誤。
- 提交事務
- 刪除ZIP和CSV,並刪除批量上傳對象(或只是不保存)
如果我們在我們以某種方式應該任意點回退通知用戶出了什麼問題。
我最初的想法是重寫保存或使用post_save信號,但沒有訪問請求意味着我既不能使用消息也不會提出驗證錯誤。在管理中重寫model_save()有它自己的問題,不能做任何驗證。
所以現在我的想法是更改ModelForm並將其提供給django管理員。我可以重寫clean()方法,引發ValidationErrors和(可能)在事務中運行我所有的東西。但我正在努力弄清楚如何以這種方式訪問這些文件,以便我可以在它們上使用Python的ZipFile和csv庫。在表單驗證方法中做實際的工作也感覺有點骯髒,但我不確定我能做到這一點。
我可能已經進入了太多細節,但我想解釋一下解決方案,以便可以提出其他解決方案。
我在這裏看到的問題是,除非保存()被調用,否則文件不會保存,所以我無法在模型clean()中進行驗證,據我所知。 –
你說得對,但你可以使用'FileField'的文件屬性,它是InMemoryUploadedFile的一個實例。我剛剛在'clean'中更新了這個例子。 –
我最後把clean()放到了ModelForm中(也許我會把它移植到模型上,稍後再清理(匆忙)),然後按照建議來做ModelAdmin的東西,它在文件系統上效率不高,但它是隻有幾個文件,它工作得很好,謝謝! –