Я хочу, чтобы каждый пользователь на моем сайте имел изображение в своем профиле. Мне не нужны никакие эскизы или что-то в этом роде, просто изображение для каждого пользователя. Чем проще, тем лучше. Проблема в том, что я не знаю, как вставить этот тип поля в мой профиль пользователя. Любые предложения?
Добавить изображение/аватар в список пользователей в django
Ответ 1
Вам нужно создать форму с чистым методом, который проверяет свойства, которые вы ищете:
#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
Надеюсь, что это поможет тебе.
Ответ 2
Чтобы подключить модель UserProfile к вашей модели User, убедитесь, что вы расширяете свою модель пользователя, как полностью объяснено в этом уроке: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/
Это позволит вам получить доступ к атрибутам 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
Ответ 3
Предполагая, что вы используете стандартный 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