我希望我网站上的每个用户在他的个人资料中都有一张图片。我不需要任何缩略图或类似的东西,只需要每个用户的图片。越简单越好。问题是我不知道如何将这种类型的字段插入到我的用户配置文件中。有什么建议么?
3 回答
您需要制作一个具有干净方法的表单来验证您正在寻找的属性:
#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.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
假设您使用的是 standard ,您可以通过设置将contrib.auth
模型指定为“用户配置文件”模型AUTH_PROFILE_MODULE
。然后,您可以使用它将您想要的任何附加信息附加到User
对象上,例如
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
avatar = models.ImageField() # or whatever