起因:
只是想要在python console下簡單測試一個file model是否真的可以上傳檔案,並且依照django setting的media root 設定將檔案上傳到指定位置。下面是一個django 的database model 的部份內容:
# The FW path and filename def generate_fw_path(instance, filename): return "uploaded_files/{0}".format(filename) class Files(models.Model): file=models.FileField(upload_to=generate_file_path) ..........其實就只是一個用來放上傳檔案的Database 欄位。
然後該makemigrations 、 migrate 建立database 之後在python的console下測試上傳檔案(ps 我用ipython取代原本弱弱的python 原生console mode。 用pip install ipython就可以使用了)。
在virtualenv 下執行ipython 進入console mode 接著import Files model與 SimpleUploadedFile。
In [1]: from django.core.files.uploadedfile import SimpleUploadedFile In [2]: from mytest.models import Files In [3]:我們先用SimpleUploadedFile 把檔案變成一個class:
_file = SimpleUploadedFile('README.md', open('README.md', 'r').read())
第一個README.md是指定上傳後的檔案名稱,第二README.md是我們用來開檔的目標檔名~由於我是把README.md直接放在專案目錄下,所以沒有給絕對路徑。
此時SimpleUploadedFile就會把檔案上傳並轉成一個物件。
print(type(_file))
得到 <class django.core.files.uploadedfile.simpleuploadedfile>
然後就可以把這個物件當作fileField丟給model去處理。
testfile = Files.objects.create(file=_file)
testfile.save()
此時在media/uploaded_files/ 目錄下應該就會多一個叫做README.md的檔案並且內容跟我們上傳的檔案內容應該會一致。
另一種則是我們一樣用SimpleUploadedFile 但是手動塞內容:
_file2 = SimpleUploadedFile('lol.txt', b'hello world')
testfile2 = Files.objects.create(file=_file2)
testfile2.save()
此時media/uploaded_files/ 目錄下應該也會多一個名叫做lol.txt的檔案,內容就只有'hello world'這兩個字。
Ref:
Django UploadedFile
留言
張貼留言