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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top