Вопрос:
Я пытаюсь создать регистрационную форму пользователя. Я знаю, что в Django есть встроенная форма регистрации пользователя, но мне сложно создать ее.
Я создал модель ModelForm из User и написал несколько методов для проверки и подтверждения пароля. Но кажется, что методы, clean_password() и clean() не выполняются form.is_valid() в views.py.
Ниже приведен фрагмент RegistrationForm –
class RegistrationForm(ModelForm): re_password = CharField(widget = PasswordInput(attrs = {‘placeholder’ : ‘Re-password’})) class Meta: model = User fields = [‘username’, ’email’, ‘password’] widgets = { ‘username’ : TextInput(attrs = {‘placeholder’:’Username’}), ’email’ : EmailInput(attrs = {‘placeholder’ : ‘Email’}), ‘password’ : PasswordInput(attrs = {‘placeholder’ : ‘Password’}) } def clean_password(self): password = self.cleaned_data[‘password’] if len(password) < 6: raise forms.ValidationError(‘Password not long enough. Should be >= 6’) return password def clean(self): if not self.cleaned_data[‘password’] == self.cleaned_data[‘re_password’]: raise forms.ValidationError(«Passwords should match») return self.cleaned_data
Дополнительный вопрос
password, похоже, не зашифрован form.save(). Мне пришлось создать новый экземпляр пользователя и вызвать его .set_password() для его шифрования. Правильно ли это?
Лучший ответ:
Ошибка с отступом. Валидаторы находятся внутри META вместо RegistrationForm.
Ответ №1
Вы правильно устанавливаете пароль. Ваше мнение должно выглядеть примерно так:
if form.is_valid(): user = form.save(commit=False) # Don’t waste the database write user.set_password(form.cleaned_data[‘password’]) user.save()
Обновить
-
вам нужно удалить свой метод clean_password и добавить validators=[validators.MinLengthValidator(6)] в объявление поля модели password (или просто определить password как поле в форме вручную и предоставить ему min_length=6).
-
Вам нужно выделить свой clean метод на 1 уровень или он никогда не будет вызван (он в настоящее время определяется как метод в вашем Meta классе).
Ответ №2
Во-первых, вы можете определить min_length пароля в методе __init__ формы, например:
def __init__(self, *args, **kwargs): super(RegistrationForm, self).__init__(*args, **kwargs) self.fields[‘password’].min_length = 6
Во-вторых, да, этот правильный путь