Можно ли переопределить метод 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 шт):

Автор решения: Andrew Holovko

Сначала устанавливаете пароль, потом сохраняете юзера, если надо изменить пароль - делайте это до сохранения.

user.set_password(user.password)
user.save()

https://docs.djangoproject.com/en/3.1/topics/auth/default/#:~:text=To%20change%20a%20user's%20password,password%20will%20be%20changed%20immediately.

→ Ссылка