Можно ли переопределить метод set_password?
У меня есть проект, в котором существуют обычные пользователи и те, которые могут создавать объекты модели. Эти особенные пользователи являются отдельной моделью с полем ForeignKey(User). Для регистрации таких есть отдельная форма и обработчик, но я не могу определить им пароль с помощью set_password(). Ошибка:''Teacher' object has no attribute set_password' Код:
models.py
class Teacher(models.Model):
name = models.CharField(max_length=20)
surname = models.CharField(max_length=20)
subject = models.ForeignKey(Subject, on_delete=models.CASCADE,
related_name='teacher_subject')
person = models.ForeignKey(User,
related_name='teacher' on_delete=models.CASCADE)
def __str__(self):
initials = self.name + ' ' + self.surname
return initials
views.py
def teacher_registration(request):
if request.method == 'POST':
user_form = TeacherRegistrationForm(request.POST)
if user_form.is_valid():
new_teacher = user_form.save(commit=False)
new_teacher.set_password(user_form.cleaned_data['password'])
new_teacher.save()
Teacher.objects.create(user=new_teacher)
return render(request, 'teachers/teacher/register_done.html',
{'new_teacher': new_teacher})
else:
user_form = TeacherRegistrationForm()
return render(request, 'teachers/teacher/register_done.html',
{'user_form': user_form})
forms.py
class TeacherRegistrationForm(forms.ModelForm):
password = forms.CharField(label='Password',
widget=forms.PasswordInput)
password2 = forms.CharField(label='Repeat password',
widget=forms.PasswordInput)
class Meta:
model = Teacher
fields = ['name', 'surname', 'subject']
def clean_password2(self):
cd = self.cleaned_data
if cd['password'] != cd['password2']:
raise forms.ValidationError('Passwords don\'t match.')
return cd['password2']
Можно ли как-то переопределить метод set_password, чтобы мой обработчик работал?
Пробовал наследование от Abstract user:
models.py
class Teacher(AbstractUser):
name = models.CharField(max_length=20)
surname = models.CharField(max_length=20)
subject = models.ForeignKey(Subject, on_delete=models.CASCADE,
related_name='teacher_subject')
person = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
settings.py
AUTH_USER_MODEL = 'education.Teacher'
Вызывает следующую ошибку:
HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.
Ответы (1 шт):
Сначала устанавливаете пароль, потом сохраняете юзера, если надо изменить пароль - делайте это до сохранения.
user.set_password(user.password)
user.save()