Ошибка подтверждения сброса пароля в Django (пользовательская модель пользователя); обновление

Я не настолько опытен в написании Python/Back-end, но пытаюсь совершенствоваться. В разработке/локальном сервере я пытаюсь создать форму сброса пароля... но я получил следующую ошибку при переходе по ссылке из письма с забытым паролем - а до этого пароль не сохранялся:

init() missing 1 required positional argument: 'user'

forms.py (почти копия/вставка из формы Django; незначительные изменения)

class ResetPasswordForm(SetPasswordForm):
    error_messages = {
        'password_mismatch': static_textLanguage['page_user_passwordReset_alert_passwordNotMatch'],
        'password_empty': static_textLanguage['global_alert_mandatoryField'],
        'minimum_length': static_textLanguage['global_alert_minCharacters_password'],
    }
    new_password1 = forms.CharField(
        required=False,
        widget=forms.PasswordInput(attrs={
            'id': 'page_userPasswordReset_content_form_input_passwordA',
            'maxlength': '25',
            'class': 'global_component_input_box'
        }),
    )
    new_password2 = forms.CharField(
        required = False,
        widget=forms.PasswordInput(attrs={
            'id': 'page_userPasswordReset_content_form_input_passwordB',
            'maxlength': '25',
            'class': 'global_component_input_box'
        }),
    )
    
    def __init__(self, user, *args, **kwargs):
        self.user = user
        super(ResetPasswordForm, self).__init__(user, *args, **kwargs)

    def clean_new_password1(self):
        password1 = self.cleaned_data.get('new_password1')
        if password1 == '' or password1 is None:
            raise forms.ValidationError(self.error_messages['password_empty'], code='password_field_empty')
        elif len(password1) < 8:
            raise forms.ValidationError(self.error_messages['minimum_length'], code='password_too_short')
        return password1

    def clean_new_password2(self):
        password1 = self.cleaned_data.get('new_password1')
        password2 = self.cleaned_data.get('new_password2')
        if password2 == '' or password2 is None:
            raise forms.ValidationError(self.error_messages['password_empty'], code='password_field_empty')
        if password1 and password2:
            if password1 != password2:
                raise ValidationError(self.error_messages['password_mismatch'], code='password_mismatch')
        password_validation.validate_password(password2, self.user)
        return password2

    def save(self, commit=True):
        password = self.cleaned_data["new_password1"]
        self.user.set_password(password)
        if commit:
            self.user.save()
        return self.user

views.py

class UserPasswordResetView(auth_views.PasswordResetConfirmView):
    template_name = '../frontend/templates/frontend/templates.user/template.page_passwordReset.html'
    form_class = ResetPasswordForm
    post_reset_login = True
    success_url = reverse_lazy('page_userLoginPrivate')

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.user
        return kwargs

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        if self.validlink:
            context.update({
                'validlink': True,
                'form': self.form_class(),
                'static_json_text': static_textLanguage,
                'static_json_textGlobal': static_textGlobal
            })
        else:
            context.update({
                'validlink': False,
                'form': None,
                'static_json_text': static_textLanguage, 
                'static_json_textGlobal': static_textGlobal
            })
        return context

template.html (для целей данного упражнения .html был упрощен)

    <div class="wrapper_page_userPasswordReset">
        {% if validlink %}
            <form id="page_userPasswordReset_content_form" class="page_userPasswordReset_content_form" method="post" novalidate>
            {% csrf_token %}
                    <div class="global_component_input_box_container">
                            {{ form.new_password1}}
                    </div>
                    <div id="page_userPasswordReset_input_passwordA_alert_errors" class="alert_message_input_danger_format">
                        {% if form.errors %}
                            {% for key, value in form.errors.items %}
                                {% if key == 'new_password1' %}
                                    {{ value }}
                                {% endif %}
                            {% endfor %}
                        {% endif %}                                
                    </div>

                    <div class="global_component_input_box_container">
                        {{ form.new_password2}}
                    </div>
                    <div id="page_userPasswordReset_input_passwordB_alert_errors" class="alert_message_input_danger_format">
                        {% if form.errors %}
                            {% for key, value in form.errors.items %}
                                {% if key == 'new_password1' %}
                                    {{ value }}
                                {% endif %}
                            {% endfor %}
                        {% endif %}                                
                    </div>

                    <button type="submit" id="page_userPasswordReset_content_form_button_submit" class="global_component_button button_background_green">{{ static_json_text.global_button_submit }}</button>
            </form>
        {% else %}
            <a href="{% url 'password_reset' %}" class="is_link_color_black"><button id="page_userPasswordReset_button_forgotPassword" class="global_component_button button_background_green">{{ static_json_text.page_user_passwordReset_notValidLink_button }}</button></a>
        {% endif %}    
    </div>
django

Скорее всего, ошибка возникает потому, что вы определили user как позиционный аргумент (def __init__(self, user, *args, **kwargs):), но передаете переменную как аргумент ключевого слова (kwargs['user'] = self.user).

Вместо вашего кода:

class ResetPasswordForm(SetPasswordForm):
    ...

    def __init__(self, user, *args, **kwargs):
        self.user = user
        ...

попробуйте изменить его на следующее (чтобы ResetPasswordForm искал user внутри kwargs):

class ResetPasswordForm(SetPasswordForm):
    ...

    def __init__(self, *args, **kwargs):
        self.user = kwargs['user']
        ...
Вернуться на верх