別のモデルでユーザーのデータにアクセスするにはどうすればよいのでしょうか? たとえば、これが私の現在の状況です。
- ユーザーは会社へのforeignKeyを持っています。したがって、ユーザーは会社に関連付けられます。
- ファイルアップロードページを実装しました。このページでは、ファイルを Amazon S3 にアップロードするカスタム ストレージ ソリューションを使用します。(S3BotoStorage に基づいています)。
- このコンストラクター内で、会社がユーザーにリンクされているこの会社に関連付けられているbucket_nameにアクセスしたいと考えています。アップロード ページを使用するには、すべてのユーザーがログインする必要があります。
- つまり、ログインしたユーザーは会社へのforeignKeyを持ち、会社はbucket_nameを持っています。ログインしたユーザーは、ファイルのアップロード ページにいます。
これはビューです:
class PictureCreateView(CreateView):
model = Picture
def __init__(self, *args, **kwargs):
super(PictureCreateView, self).__init__(*args, **kwargs)
def form_valid(self, form):
self.object = form.save()
self.request.FILES.get('file')
data = [{'name': f.name, 'url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), 'thumbnail_url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), 'delete_url': reverse('upload-delete', args=[self.object.id]), 'delete_type': "DELETE"}]
response = JSONResponse(data, {}, response_mimetype(self.request))
response['Content-Disposition'] = 'inline; filename=files.json'
return response
これは画像モデルです(ファイルモデルなど)
from django.core.files.storage import default_storage as s3_storage
class Picture(models.Model):
def custom_upload_to(instance, filename):
return 'pictures/' + filename
def save(self, *args, **kwargs):
super(Picture, self).save(*args, **kwargs)
file = models.FileField(storage=s3_storage,upload_to=custom_upload_to)
これは、settings.py で default_storage として設定したストレージ モデルです。
from storages.backends.s3boto import S3BotoStorage
class customStorage(S3BotoStorage):
def __init__(self, *args, **kwargs):
kwargs['bucket'] = ***HERE-I-WANT-TO-GET-COMPANY'S-BUCKET***
super(customStorage, self).__init__(*args, **kwargs)
from またはテンプレートから、引数を渡して後で取得できますか? この情報をモデル内で直接取得できますか? これを行う方法についてのアイデアはありますか?
ありがとう!
編集: ユーザーにはリンク先の会社への ForeignKey が含まれ、その会社には問題のバケットが含まれるため、これはユーザーと関係があります...
編集 #2: form_save でself.object.user = self.request.userを試してみましたが、それを超えて UserProfile クラスで User を拡張したときに追加したフィールドにアクセスするにはどうすればよいですか? 例えば:
self.object.user = self.request.user
self.company = self.object.user.company.bucket
したがって、Company はユーザー拡張プロファイル内のforeign_key であり、company にはバケット フィールドが含まれています。