我想創建一個文件夾的每個用戶把他們的項目將文件保存到一個模型。因此,他們的文件將具有路徑..\project\id\filename
,id
是用戶id
和filename
是文件的名稱。現在使用Filefield
中的upload_to
(instance
和filename
)所允許的參數,我意識到instance.id
將是None
,文件的路徑將是..\project\None\filename
而不是..\project\id\filename
。如何使用upload_to動態路徑
現在讀Django documentation upload_to我看到了這一點:
在大多數情況下,這個對象將不會被保存到數據庫 還,所以如果使用默認的下拉列表AutoField,它可能還沒有一個 它的主鍵字段的值。
我的解釋是,創建一個新的記錄,並user_directory_path
不是在同一時間實例,那就是,當我打電話create
上Project
模型,instance.id
將None
。我的問題是,現在有沒有辦法解決這個問題?雖然我看到upload_to
很方便,但對於動態路徑(如我正在做的那樣)來說,這並不一定很方便。我正在考慮創建記錄,然後在更新中添加文件路徑,但我正在尋找一種可以一步保存所有內容的方法。
models.py
def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
return 'project/{0}/{1}'.format(instance.user.id, filename)
class Project(models.Model):
email = models.ForeignKey(User,
to_field="email",
max_length=50
)
title = models.CharField(max_length=100)
date_created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
file = models.FileField(upload_to=user_directory_path, validators=[validate_file_type], null=True)
當表格通過驗證時,這是views.py
。在create
之前調用user_directory_path
。
email = request.user.email
title = request.POST.get('title', '')
file = request.FILES['file']
filename = file.name
instance = Usermie.objects.get(email=request.user.email)
# Save to model
user_directory_path(instance=instance, filename=filename)
Project.objects.create(
title=title, file=file,
)
'而且獎金是,如果用戶更改他們的電子郵件地址,它將在任何地方都會發生變化,您不必依賴級聯更新來修復所有外鍵。「在ForeignKey中使用id的非常好的理由。 –
謝謝!這實際上給了我更好的視力。我將返回並將所有其他模型中的電子郵件字段更改爲用戶標識。直到現在,我還沒有意識到用戶更改電子郵件的問題。謝謝@Massan。我一直知道這一點,但沒有意識到我在做這件事。 – Jam1
不客氣,我很高興我可以提供幫助。我應該提到的另一件事是,一旦創建了項目,就不能允許用戶更改,因爲這會改變目錄路徑,並且django不會再找到這些文件。 –