0
綜上所述,我想在這裏完成替換舊文件是:Django的最佳實踐文件上傳
- 要爲組織和安全起見進行了上傳文件的名稱轉變
- 不再保留舊的文件永遠在存儲
假設你有一個Company
模型有一個標誌。像
class Company(models.Model):
name = ...
logo = models.FileField(blank=True, null=True)
現在的東西,因爲我是一個有點偏執,我真的不喜歡那個上傳的文件獲得通過(潛在的邪惡)用戶的名稱是事實,我添加了一個upload_to
參數指向一個功能就像
def logo_getfilename(instance, filename):
extension = ... # get just the original extension from the file
return 'logos/' + str(uuid.uuid4()) + extension
好的,所以現在只有視圖丟失了!
def company_edit(request, ...):
company = ... # get the company and stuff
if request.method == 'POST':
form = CompanyAdminForm(request.POST, request.FILES, instance=company)
last_file_path = None
if not company.logo is None:
last_file_path = company.logo.path
# ^^ after calling is_valid(), file_path gets changed to
# the would-be-default-behavior
if form.is_valid():
# first we write the new file
form.save()
# now we remove the old one
os.unlink(last_file_path)
雖然這是目前工作的,我不是因爲
- 我使用
os.unlink()
代替FieldFile.delete()
這似乎是錯的很舒服 - 我假設一個本地文件系統存儲
- 我仍然沒有做任何反對命名衝突的事情(他們可能仍然會發生)
- 我忽略了多個塊,並假設
form.save()
負責一切 - 我不考慮交易行爲(以前的文件應只有在
.save()
模式變化將提交給數據庫中刪除 - 我感覺有一些問題,有我甚至不知道
因此,爲了實現這些簡單(並且不那麼罕見)的目標,您的建議是什麼?