2011-06-18 12 views
20

Chcę, aby każdy użytkownik w mojej witrynie miał obraz w swoim profilu. Nie potrzebuję żadnych miniatur ani czegoś w tym stylu, tylko obraz dla każdego użytkownika. Im prostsze, tym lepiej. Problem polega na tym, że nie wiem, jak wstawić ten typ pola do mojego profilu użytkownika. Jakieś sugestie?Dodaj pole image/awatar do użytkowników w django

+0

Jakie jest Twoje konkretne pytanie? –

Odpowiedz

32

Musisz złożyć formularz, który ma czyste metodę, która sprawdza właściwości, których szukasz:

#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 

nadzieję, że pomoże Ci się.

+2

Ten przykład również pomógł mi: https://coderwall.com/p/bz0sng – ferrangb

4

Zakładając, że używasz standardu contrib.auth, możesz wyznaczyć model jako 'user profile' model, poprzez ustawienie AUTH_PROFILE_MODULE. Następnie możesz użyć go do dołączenia wszelkich dodatkowych informacji, które chcesz do obiektów User, np.

from django.contrib.auth.models import User 

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    avatar = models.ImageField() # or whatever 
+0

Mam model dla UserProfile, mój problem polega na wstawianiu do niego obrazu (ponieważ nie jest on podobny do żadnego innego zwykłego pola) – smhagut

+1

@smhagut: Przeczytaj [dokumentację dotyczącą przesyłania plików] (https://docs.djangoproject.com /en/1.3/topics/http/file-uploads/). –

+0

To jest dla każdego rodzaju pliku. Jak mogę się upewnić, że jest to plik obrazu w określonym rozmiarze? (nie większy niż 250 KB, na przykład) i jak połączyć go z moim profilem użytkownika? – smhagut

10

Aby połączyć model USERPROFILE do modelu użytkownika upewnij się, że rozszerzenie modelu użytkownika w pełni wyjaśnione w tym tutorialu: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

To pozwoli Ci uzyskać dostęp do atrybutów UserProfile dla Użytkownika, w tym awatara, używając user.get_profile(). avatar. (Uwaga składni w różny w szablonie, patrz poniżej na sposób wyświetlania awatara w szablonie).

Można użyć pola obrazu w modelu UserProfile do Avatar:

avatar = models.ImageField(upload_to='/images/) 

to działa dokładnie jak FileField, ale jest specyficzny dla obrazów i sprawdza, czy przesłany obiekt jest prawidłowym obrazem. Aby ograniczyć rozmiar pliku można użyć odpowiedź udzieloną przez @pastylegs tutaj: Max image size on file upload

Następnie, zakładając swój model UserProfile nazywa UserProfile, dostęp awatara w szablonie następująco:

<img src=path/to/images/{{ user.get_profile.avatar }}"> 

Więcej o polu obrazu tutaj: https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield

Powiązane problemy