0
根據文件擴展名,我希望文件存儲在特定的AWS存儲桶中。我嘗試將一個函數傳遞給storage
選項,類似於upload_to
是如何動態定義的。如何動態選擇models.FileField的存儲選項?
但是,這並沒有給出預期的結果。在我的模板中,當我嘗試href到document.docfile.url時,鏈接不起作用。
在外殼檢查,出現這種情況
Document.objects.all()[0].docfile.storage.bucket
<Bucket: <function aws_bucket at 0x110672050>>
Document.objects.all()[0].docfile.storage.bucket_name
<function myproject.myapp.models.aws_bucket>
期望的行爲將
Document.objects.all()[0].docfile.storage.bucket_name
'asynch-uploader-txt'
Document.objects.all()[0].docfile.storage.bucket
<Bucket: asynch-uploader-txt>
這是我models.py
文件:
# -*- coding: utf-8 -*-
from django.db import models
from storages.backends.s3boto import S3BotoStorage
def upload_file_to(instance, filename):
import os
from django.utils.timezone import now
filename_base, filename_ext = os.path.splitext(filename)
return 'files/%s_%s%s' % (
filename_base,
now().strftime("%Y%m%d%H%M%S"),
filename_ext.lower(),
)
def aws_bucket(instance, filename):
import os
filename_base, filename_ext = os.path.splitext(filename)
return 'asynch-uploader-%s' %(filename_ext[1:])
class Document(models.Model):
docfile = models.FileField(upload_to=upload_file_to,storage=S3BotoStorage(bucket=aws_bucket))
爲什麼aws_bucket
越來越作爲一個函數傳遞而不是一個字符串,方式upload_file_to
是?我該如何糾正它?
我不知道這是如何工作的。我需要在運行時通過文件名的擴展名來決定存儲區。如果我創建一個從S3BotoStorage繼承的新類,我不會被要求選擇一個固定的桶,或者遇到同樣的問題嗎? – thatharmansingh
我沒有[this](http://pastebin.com/raw/GQJ6ad72),但存在同樣的問題,即docfile.bucket被賦予一個函數而不是字符串值,稍後訪問docfile.url會給出一個錯誤, 「不能連接str和函數」。 – thatharmansingh
從我所看到的源代碼中,不需要在初始化時選擇它。如果你重寫bucket屬性,那麼你可以訪問所有的實例變量。我想你可以在那個時候訪問文件名,這將允許你正確計算你想要使用的存儲桶。以哪種方式查看S3BotoStorage源代碼。你不應該覆蓋太多的方法。 – Paul