Добавить изображение / аватар поле для пользователей в django

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

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 к модели пользователя, убедитесь, что вы расширяете модель пользователя, как полностью описано в этом руководстве:http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

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

вы можете использовать поле изображения в вашей модели 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


предполагая, что вы используете standard contrib.auth, вы можете назначить модель как 'Профиль пользователя', via AUTH_PROFILE_MODULE настройка. Затем вы можете использовать его, чтобы прикрепить любую дополнительную информацию к User объекты, например,

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user   = models.OneToOneField(User)
    avatar = models.ImageField() # or whatever