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

假设您使用的是 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
于 2011-06-18T13:49:57.867 回答