在django中为用户添加图像/头像字段

hag*_*utm 22 django avatar django-users

我希望我网站中的每个用户都能在他的个人资料中看到一张图片.我不需要任何缩略图或类似的东西,只需每个用户的图片.越简单越好.问题是我不知道如何将这种类型的字段插入我的用户配置文件.有什么建议?

Bra*_*don 43

您需要创建一个具有clean方法的表单,以验证您正在查找的属性:

#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
Run Code Online (Sandbox Code Playgroud)

希望能帮到你.


rol*_*one 10

要将UserProfile模型连接到用户模型,请确保扩展用户模型,如本教程中的完整说明:http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-用户模型/

这将允许您使用user.get_profile().avatar访问用户的UserProfile属性,包括头像.(请注意模板中的语法不同,请参阅下文,了解如何在模板中显示头像.)

您可以在UserProfile模型中使用图像字段作为头像:

avatar = models.ImageField(upload_to='/images/)
Run Code Online (Sandbox Code Playgroud)

这与FileField完全相同,但特定于图像并验证上载的对象是有效图像.要限制文件大小,您可以使用@pastylegs给出的答案: 文件上传时的最大图像大小

然后,假设您的userprofile模型名为UserProfile,您可以访问模板中的头像,如下所示:

<img src=path/to/images/{{ user.get_profile.avatar }}">
Run Code Online (Sandbox Code Playgroud)

有关图像字段的更多信息,请访问:https: //docs.djangoproject.com/en/dev/ref/models/fields/#imagefield


Cat*_*lus 6

假设您使用标准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
Run Code Online (Sandbox Code Playgroud)

  • @smhagut:阅读[文件上传文档](https://docs.djangoproject.com/zh/1.3/topics/http/file-uploads/)。 (2认同)