Добавить изображение / аватар для пользователей в Django - PullRequest
20 голосов
/ 18 июня 2011

Я хочу, чтобы у каждого пользователя на моем сайте было изображение в его профиле.Мне не нужны никакие эскизы или что-то в этом роде, просто картинка для каждого пользователя.Чем проще, тем лучше.Проблема в том, что я не знаю, как вставить этот тип поля в мой профиль пользователя.Есть предложения?

Ответы [ 3 ]

41 голосов
/ 18 июня 2011

Вам нужно создать форму с чистым методом, который проверяет свойства, которые вы ищете:

#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

Надеюсь, это поможет вам.

10 голосов
/ 18 июня 2011

Чтобы подключить модель UserProfile к вашей модели User, убедитесь, что вы расширяете свою модель User, как подробно описано в этом руководстве: http://www.b -list.org / weblog / 2006 / jun / 06 / django-tips- расширение пользователь-модель /

Это позволит вам получить доступ к атрибутам UserProfile для вашего пользователя, включая аватар, используя user.get_profile (). Avatar. (Обратите внимание на синтаксис в вашем шаблоне, см. Ниже, как отобразить аватар в вашем шаблоне.)

Вы можете использовать поле изображения в своей модели UserProfile для аватара:

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

6 голосов
/ 18 июня 2011

Предполагая, что вы используете стандарт 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
...