28

私のウェブサイトの各ユーザーが自分のプロフィールに画像を持っていることを望んでいます。サムネイルなどは必要ありません。ユーザーごとの写真だけです。シンプルであるほど良い。問題は、このタイプのフィールドをユーザープロファイルに挿入する方法がわからないことです。助言がありますか?

4

3 に答える 3

53

探しているプロパティを検証するクリーンなメソッドを持つフォームを作成する必要があります。

#models.py
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user   = models.OneToOneField(User)
    avatar = models.ImageField()


#forms.py
from django import forms
from django.core.files.images import get_image_dimensions

from my_app.models import UserProfile


class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile

    def clean_avatar(self):
        avatar = self.cleaned_data['avatar']

        try:
            w, h = get_image_dimensions(avatar)

            #validate dimensions
            max_width = max_height = 100
            if w > max_width or h > max_height:
                raise forms.ValidationError(
                    u'Please use an image that is '
                     '%s x %s pixels or smaller.' % (max_width, max_height))

            #validate content type
            main, sub = avatar.content_type.split('/')
            if not (main == 'image' and sub in ['jpeg', 'pjpeg', 'gif', 'png']):
                raise forms.ValidationError(u'Please use a JPEG, '
                    'GIF or PNG image.')

            #validate file size
            if len(avatar) > (20 * 1024):
                raise forms.ValidationError(
                    u'Avatar file size may not exceed 20k.')

        except AttributeError:
            """
            Handles case when we are updating the user profile
            and do not supply a new avatar
            """
            pass

        return avatar
于 2011-06-18T14:42:08.927 に答える
10

UserProfileモデルをUserモデルに接続するには、このチュートリアルで完全に説明されているように、Userモデルを拡張していることを確認してください:http ://www.b-list.org/weblog/2006/jun/06/django-tips-extending-ユーザーモデル/

これにより、user.get_profile()。avatarを使用して、アバターを含むユーザーのUserProfile属性にアクセスできるようになります。(テンプレート内の構文が異なることに注意してください。テンプレートにアバターを表示する方法については、以下を参照してください。)

アバターのUserProfileモデルで画像フィールドを使用できます。

#upload at specific location
avatar = models.ImageField(upload_to='images')

これはFileFieldとまったく同じように機能しますが、画像に固有であり、アップロードされたオブジェクトが有効な画像であることを検証します。ファイルサイズを制限するには、@pastylegsによる回答を使用できます。 ファイルアップロード時の最大画像サイズ

次に、userprofileモデルの名前がUserProfileであると仮定して、次のようにテンプレートのアバターにアクセスします。

<img src=path/to/images/{{ user.get_profile.avatar }}">

画像フィールドの詳細については、 https ://docs.djangoproject.com/en/dev/ref/models/fields/#imagefieldをご覧ください。

于 2011-06-18T14:55:31.100 に答える
7

標準を使用していると仮定すると、設定を介してモデルを「ユーザープロファイル」contrib.authモデルとして指定できます。次に、それを使用して、必要な追加情報をオブジェクトに添付できます。AUTH_PROFILE_MODULEUser

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user   = models.OneToOneField(User)
    avatar = models.ImageField() # or whatever
于 2011-06-18T13:49:57.867 に答える