Ajouter un champ Image / Avatar aux utilisateurs de Django
-
29-10-2019 - |
Question
Je veux que chaque utilisateur de mon site Web ait une image dans son profil. Je n'ai pas besoin de miniatures ou quelque chose comme ça, il suffit d'imaginer pour chaque utilisateur. Le plus simple, mieux c'est. Le problème est que je ne sais pas comment insérer ce type de champ à mon profil utilisateur. Aucune suggestion?
La solution
Vous devez faire un formulaire qui a une méthode propre qui valide les propriétés que vous recherchez:
#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
J'espère que cela vous aide.
Autres conseils
Pour connecter le modèle UserProfile à votre modèle d'utilisateur, assurez-vous que vous étendez votre modèle d'utilisateur comme entièrement expliqué dans ce tutoriel: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/
Cela vous permettra d'accéder aux attributs d'utilisateur PROFILE pour votre utilisateur, y compris l'avatar, en utilisant user.get_profile (). Avatar. (Notez la syntaxe dans différents dans votre modèle, voir ci-dessous pour afficher l'avatar dans votre modèle.)
Vous pouvez utiliser un champ d'image dans votre modèle UserProfile pour l'avatar:
avatar = models.ImageField(upload_to='/images/)
Cela fonctionne exactement comme un champ de fichiers mais est spécifique aux images et valide que l'objet téléchargé est une image valide. Pour limiter la taille du fichier, vous pouvez utiliser la réponse donnée ici par @PastyLegs:Taille d'image maximale sur le téléchargement de fichiers
Ensuite, en supposant que votre modèle UserProfile s'appelle UserProfile, vous accédez à l'avatar dans votre modèle comme suit:
<img src=path/to/images/{{ user.get_profile.avatar }}">
En savoir plus sur le champ d'image ici:https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield
En supposant que vous utilisez Standard contrib.auth
, vous pouvez désigner un modèle en tant que modèle de «profil utilisateur», passant par AUTH_PROFILE_MODULE
paramètre. Vous pouvez ensuite l'utiliser pour joindre toutes les informations supplémentaires que vous souhaitez User
objets, par exemple
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
avatar = models.ImageField() # or whatever