web-dev-qa-db-fra.com

Ajouter un champ image / avatar aux utilisateurs dans django

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?

22
hagutm

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.

47
Brandon

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

10
rolling stone

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
6
Cat Plus Plus