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
Odpowiedz
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ę.
Ten przykład również pomógł mi: https://coderwall.com/p/bz0sng – ferrangb
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
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
@smhagut: Przeczytaj [dokumentację dotyczącą przesyłania plików] (https://docs.djangoproject.com /en/1.3/topics/http/file-uploads/). –
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
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
Jakie jest Twoje konkretne pytanie? –