2017-06-22 18 views
0

背景:我正在創建Django應用程序來管理收據。用戶將創建一個新的Receipt,填寫一些與收據有關的信息(例如成本,項目,購買日期等),並上傳收據副本以供存儲。Django模型:使用DateField在FileField中設置參數

問題:我要收據* .pdf文件存儲基於用戶輸入的購買日期的文件夾中,但是,我沒有獲得self.date.strftime('%Y %B')直到實例化之後。

示例代碼:

class Receipt(models.Model): 
    date = models.DateField() 
    item = models.CharField(max_length=128) 
    scan = models.FileField(upload_to='scans/{d}/'.format(d=date.strftime('%Y %B')), 
          max_length=100) 

研究:

SO question需要做同樣的事情,但出於不同的原因。他得到的答案是,如果不覆蓋save()方法,這是不可能的。這將如何與文件上傳工作?

SO question具體解決如何使用函數設置FileField的參數;然而,它不涉及使用來自尚未完成模型的字段(即Receipt)。

我的解決辦法是什麼?

+0

[Django FileField with upload \ _to to determine at runtime](https://stackoverflow.com/questions/1190697/django-filefield-with-upload-to-determined-at-runtime) –

+0

絕對不是一個該問題的重複。我的問題具體涉及到使用模型字段來設置自己的字段。 –

+0

上述問題對於您的問題有一個完美的答案。創建一個使用你的日期字段的函數,併爲你返回文件的絕對路徑。 –

回答

0

您是否需要在運行時更改upload_to文件夾?

此功能得到的文件夾名稱:

def get_upload_to(instance, filename): 
     dest = getattr(instance, 'upload_destination', 'scans') 
     date = '/{d}/'.format(d=date.strftime('%Y %B') 
     return '/'.join([dest, date]) 

,並上傳字段(models.py)致電上述功能:

file = models.FileField(
      upload_to=get_upload_to, 
      null=True, 
      blank=False 
     ) 

,並在模型保存在您的瀏覽請求後:

your_model = your_form.save(commit=False) 
setattr(your_model, 'upload_destination', 'scans/') 
your_model.save() 

我希望有幫助!

相關問題