Я пытаюсь установить Пользователя - отношения UserProfile, отобразить форму и сохранить данные.
При представлении данные сохраняются, кроме пароля, поле не становится хешированным.
Forms.py
class UserForm(forms.ModelForm):
username = forms.RegexField(label="Username", max_length=30,
regex=r'^[\w.@+-]+$', help_text = "My text",
error_messages = {'invalid':
"This value may contain only letters, numbers and @/./+/-/_ characters."
}
)
password = forms.CharField(label="Password",
widget=forms.PasswordInput)
class Meta:
model = User
fields = ["first_name", "last_name", "username", "email", "password"]
def clean_username(self):
username = self.cleaned_data['username']
if not re.search(r'^\w+$', username):
raise forms.ValidationError(
'Username can contain only alphanumeric characters')
try:
User.objects.get(username=username)
except ObjectDoesNotExist:
return username
raise forms.ValidationError('Username is already taken')
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ['user_is']
EDIT: исходный вопрос был отредактирован после написания этого ответа
Чтобы установить пароль для пользователя, вы не устанавливаете profile.user.password = new_password
- то, что делает использование modelform в этом случае; это установит его непосредственно как нешэшированное значение.
Для установки пароля необходимо использовать соответствующий API. Поэтому перед profile.save()
поставьте:
profile.user.set_password(uform.cleaned_data['password'])
Чтобы убить help_text, либо не используйте рендер quick form.as_foo, либо переопределите поле, чтобы help_text был none в методе init() вашей ModelForm (см. документацию по формам Django)a
Ладно, отвечу на свой вопрос. Это может пригодиться другим.
Добавьте следующее в класс UserForm
def save(self, commit=True):
user = super(UserForm, self).save(commit=False)
user.set_password(self.cleaned_data["password"])
if commit:
user.save()
return user