ファイルの拡張子によっては、ファイルを特定のAWSバケットに保存する必要があります。私はstorage
オプションに関数を渡そうとしましたが、upload_to
がどのように動的に定義されているかに似ています。モデルのストレージオプションを動的に選択する方法.FileField?
しかし、これは望ましい結果を与えません。私のテンプレートで、hrefをdocument.docfile.urlにしようとすると、リンクは機能しません。
# -*- 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
を関数として渡さなっている:シェルのチェックイン
、これは
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
ファイルであるだろう起こります文字列ではなく、その方法はupload_file_to
は?どうすれば修正できますか?
どのように動作するのかわかりません。実行時にファイル名の拡張子でバケットを決定する必要があります。 S3BotoStorageから継承する新しいクラスを作成した場合でも、固定バケットを選択する必要はありませんか、同じ問題が発生しますか? – thatharmansingh
私は[this](http://pastebin.com/raw/GQJ6ad72)でしたが、同じ問題が存在します。つまり、docfile.bucketに文字列値の代わりに関数が割り当てられ、docfile.urlにアクセスするとエラーが発生します。 msgstr "strと関数を連結できません" msgid。 – thatharmansingh
ソースコードを見ると、初期化するときに選択する必要はありません。バケットプロパティをオーバーライドすると、すべてのインスタンス変数にアクセスできます。その時点でファイル名にアクセスできるようになりますので、使用するバケットを適切に計算できるようになります。どちらの方法でS3BotoStorageのソースコードを見てください。あまりにも多くのメソッドをオーバーライドする必要はありません。 – Paul