2011-09-14 14 views
2

私のサイトでは、自分自身のプロフィール画像をアップロードできます.ImageFieldは、コアUserモデルを拡張するUserProfileモデルで管理します。私は、アップロードされた画像のサムネイルバージョンを作成するために、PILを使用していDjango:ImageFieldに相対画像と絶対的な画像パスを保存する

class UserProfile(models.Model): 
    picture = models.ImageField(upload_to='img', blank=True, null=True) 
    profile_picture = models.ImageField(upload_to='img', default='img/profile/default_profile.png', blank=True, null=True) 
    user = models.ForeignKey(User, unique=True) 

:ここでのUserProfileモデルの簡易版です。私のテンプレートでプロフィール画像を表示するには

次のように、私はドキュメントで推奨url機能を使用しています:

{{ user.get_profile.profile_picture.url }} 

ユーザーがフェイスブックに自分のアカウントを接続したときに、私が扱ってる問題があります自分のFacebookプロフィール画像を私のサイトのプロフィール画像として使用したいと考えています。

ユーザーが指定した設定に応じて、アップロードした画像またはFacebookのプロフィール画像の表示を処理する最善の方法は何ですか?

profile_pictureフィールドにFacebookのプロフィール画像へのパスを保存すると、サイトの各プロフィール画像を表示する前に確認する必要があります。そうしないと、MEDIA_ROOT/MEDIA_URLが事前に設定されます画像:

/media/https://graph.facebook.com/[fbid]/picture 

私の他のオプションは、画像がアップロードされるたびprofile_pictureフィールドにMEDIA_ROOT/MEDIA_URLを追加することです。残念ながら、これを行う唯一の方法は、私のviews.pyのadd_profile_picture関数です.Djangoはデフォルトでスラッシュの先頭に画像のパスを保存することと、相対パスで始まる画像を開こうとすると、スラッシュ。しかし、私は完全に画像のパスを事前に保留する場合は、私のテンプレートでurl関数を使用する必要はありません、私は次のように画像を表示することができ、アップロードされた画像またはFacebookの画像であるかどうか正しく動作します:

{{ user.get_profile.profile_picture }} 

しかし、これらのオプションの両方がハックのように感じ、これを行うには、より効率的な方法がなければならないような気がしますので、私はここでのベストプラクティスに関するいくつかのインスピレーション/指導のためのSOに回しています。

ご協力いただきありがとうございます。

答えて

1

可能性のカップル:書き込みに

  1. 、リード上save()を上書きし、所望の値に所定の値をマッサージデータベースに書き込む前に、又は
  2. 、格納された値を検査する方法を作成しますそれを適切なパターンにマッサージします。あなたは、私が(同じが異なる)これらの線に沿って自分自身の戦いで、私はCharFieldですの賛成で全くのImageFieldを放棄し、ルーチンを聞かせすることを追加される場合がありますテンプレート

から直接アクセスできるように@propertyデコレータを適用します。 (例えば:サムネイル)。

+0

+1ありがとうございました。オプション1と似たようなものになりました。 –

関連する問題