Je souhaite que chaque utilisateur de mon site Web ait une image dans son profil. Je n'ai pas besoin de vignettes ou de quelque chose comme ça, juste une image pour chaque utilisateur. Le plus simple sera le mieux. Le problème est que je ne sais pas comment insérer ce type de champ dans mon profil utilisateur. Aucune suggestion?
Vous devez créer un formulaire avec 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.
Pour connecter le modèle UserProfile à votre modèle User, assurez-vous d'étendre votre modèle User comme expliqué en détail dans ce tutoriel: http://www.b-list.org/weblog/2006/jun/06/Django- conseils-extension-modèle-utilisateur /
Cela vous permettra d'accéder aux attributs UserProfile de votre utilisateur, y compris l'avatar, en utilisant user.get_profile (). Avatar. (Notez la syntaxe différente dans votre modèle, voir ci-dessous comment afficher l'avatar dans votre modèle.)
Vous pouvez utiliser un champ d'image dans votre modèle UserProfile pour l'avatar:
#upload at specific location
avatar = models.ImageField(upload_to='images')
Cela fonctionne exactement comme un FileField mais est spécifique pour les 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 maximale de l'image lors du téléchargement du fichier
Ensuite, en supposant que votre modèle de profil utilisateur s'appelle UserProfile, vous accédez à l'avatar dans votre modèle comme suit:
<img src=path/to/images/{{ user.get_profile.avatar }}">
Plus d'informations sur le champ image ici: https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield
En supposant que vous utilisez la norme contrib.auth
, vous pouvez désigner un modèle comme modèle 'profil utilisateur' , via AUTH_PROFILE_MODULE
réglage. Vous pouvez ensuite l'utiliser pour attacher toute information supplémentaire que vous souhaitez aux objets User
, par exemple.
from Django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
avatar = models.ImageField() # or whatever