Вы сами реализуете много логики, которую ModelForm
должен обработать. Одна из основных целей ModelForm
- создание и редактирование объектов модели без большого количества шаблонной логики.
Непонятно, почему вы вообще используете вторую форму. Тем более, что вы не делаете этого и не делаете с ним много. Так что, возможно, имеет смысл отбросить эту форму.
Ваш EditProfileForm
содержит супер-вызов с классом, который не является суперклассом этого класса, вы должны использовать super(ModelForm, self)
вместо super(UserForm, self)
.
class EditProfileForm(forms.ModelForm):
# ...
def clean(self):
cleaned_data = super(<b>ModelForm</b>, self).clean()
# ...
return cleaned_data
Основная проблема заключается в том, что вы инициализируете форму с помощью:
pform = UserProfileInfoForm(request.POST or None, initial={'confirm_pwd': <s>user.confirm_pwd</s>})
, поскольку user
не имеет confirm_pwd
поля или атрибута или свойства.
Кроме того, модель User
не сохраняет необработанные пароли. Эти пароли хэшируются, чтобы хакер не смог проверить пароли, если им удастся получить доступ к базе данных.
Вы можете реализовать свой вид с помощью:
from django.contrib.auth.decorators import <b>login_required</b>
from django.shortcuts import <b>redirect</b>
<b>@login_required</b>
def edit_profile(request):
if request.method == 'POST':
form = EditProfileForm(request.POST, instance=request.user)
if form.is_valid():
user = form.save(<b>commit=False</b>)
user.<b>set_password(form.cleaned_data['password'])</b>
user.save()
return <b>redirect('signupapp:profile')</b>
else:
form=EditProfileForm(instance=request.user)
return render(request, "signupapp/edit_profile.html", {'form':form })
Вероятно, было бы лучше пропатчить __init__
вашего EditProfileForm
, поскольку теперь он будет инициализировать поле пароля с помощью хешированной версии пароля. Таким образом, он отличается от введенного пароля и, кроме того, он предоставляет некоторые данные в базе данных, которые, вероятно, следует хранить в безопасности.