私のウェブサイトの各ユーザーのプロフィールに画像が含まれるようにしたいと考えています。サムネイルなどは必要ありません。ユーザーごとに写真を撮るだけです。シンプルなほど良い。問題は、このタイプのフィールドをユーザープロファイルに挿入する方法がわからないことです。助言がありますか?
探しているプロパティを検証するクリーンなメソッドを持つフォームを作成する必要があります。
#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
お役に立てば幸いです。
UserProfileモデルをUserモデルに接続するには、このチュートリアルで完全に説明されているように、Userモデルを拡張していることを確認してください。 http://www.b-list.org/weblog/2006/jun/06/Django- tips-extending-user-model /
これにより、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
標準のcontrib.auth
を使用しているとすると、AUTH_PROFILE_MODULE
設定を使用して、モデルを 'user profile' model として指定できます。次に、それを使用して、User
オブジェクトに必要な追加情報を添付できます。
from Django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
avatar = models.ImageField() # or whatever