Не отправляются изображения в форме на django
Точнее даже сказать название изображения отправляется, но ничего не меняется. У меня есть модель юзера. У юзера есть свой аватар (ImageField). Я написал форму, все вывел в шаблон. При отправке формы все сохраняется, кроме картинки. Но при изменении в админке все нормально. Почему? Если надо, вот сам сайт на pythonanywhere.com (регистрируетесь и в настройках редактирование профиля)
settings.py:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
models.py:
class User(AbstractBaseUser):
GENDER = [
('male', 'MALE'),
('female', 'FEMALE'),
]
username = models.CharField('username', max_length = 30, unique = True)
email = models.EmailField('email adress', max_length = 60, unique = True)
first_name = models.CharField('first name', max_length = 30, null = True, blank = True)
last_name = models.CharField('last name', max_length = 30, null = True, blank = True)
date_joined = models.DateField('date of join', auto_now_add = True)
age = models.IntegerField('age', null = True, blank = True)
gender = models.CharField('gender', max_length = 30, choices = GENDER, null = True, blank = True)
image = models.ImageField(upload_to = 'account/avatars/%y/%m/%d', null = True, blank = True)
is_staff = models.BooleanField(default = False)
is_admin = models.BooleanField(default = False)
is_superuser = models.BooleanField(default = False)
is_active = models.BooleanField(default = True)
objects = UserManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
def __str__(self):
return self.username
def has_perm(self, perm, obj = None):
return self.is_admin
def has_module_perms(self, app_label):
return True
forms.py:
class UserUpdateForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'email', 'first_name', 'last_name', 'age', 'gender', 'image']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
#for field in self.fields:
#self.fields[field].widget.attrs['autocomplete'] = 'off'
self.fields['first_name'].widget.attrs['placeholder'] = 'Your first name'
self.fields['last_name'].widget.attrs['placeholder'] = 'Your last name'
self.fields['age'].widget.attrs['placeholder'] = 'Your age'
self.fields['username'].widget.attrs['placeholder'] = 'Your username'
self.fields['email'].widget.attrs['placeholder'] = 'Your email'
self.fields['image'].widget.attrs['enctype'] = 'multipart/form-data'
views.py:
class SettingsView(MessagesMixin, View):
def get(self, request):
context = {
'form': UserUpdateForm(instance = request.user),
}
return render(request, 'account/update.html', context)
def post(self, request):
right_username = request.user.username
right_email = request.user.email
form = UserUpdateForm(request.POST, instance = request.user)
if form.is_valid():
form.save()
self.set_success_msg('Profile was successfule updated')
else:
username = request.POST.get('username')
email = request.POST.get('email')
form = UserUpdateForm(instance = request.user)
for user in User.objects.all():
if username == user.username and user.email != right_email:
self.set_error_msg('This username is already taken')
if email == user.email and user.username != right_username:
print(user, ' - ', user.email)
print(right_username)
self.set_error_msg('This email is alreade taken')
return redirect(reverse('account:settings'))
html:
<form method="post" class="user-update-form">
{% csrf_token %}
{% for field in form %}
{{field.label_tag}}
{{field}}
{% endfor %}
<input type="submit" value="Save">
</form>
Ответы (1 шт):
Автор решения: unknown
→ Ссылка
- Добавьте в шаблон
enctype="multipart/form-data"
<form method="post" class="user-update-form" enctype="multipart/form-data">
- При обработке формы нужно также передавать
request.FILES
form = UserUpdateForm(request.POST, request.FILES, instance = request.user)