Как переопределить форму в django-rest-auth моей собственной пользовательской формой? - PullRequest
0 голосов
/ 11 января 2019

Я использую django-rest-auth и пытаюсь исправить ошибку в представлении сброса пароля, переписав один из методов формы. Хотя я успешно сделал нечто похожее с другой формой django-rest-auth, я не могу заставить ее работать на этом. Что бы я ни делал, используется старая форма.

апи / urls.py

from django.urls import include, path
from django.contrib.auth import views
from django.conf.urls import include, url
from django.views.generic.base import RedirectView
from .forms import SetPasswordFormCustom
from .forms import PasswordResetFormCustom

urlpatterns = [
    path('password/reset/',
        views.PasswordResetView.as_view(form_class=PasswordResetFormCustom),
        name='rest_password_reset'),
    path('rest-auth/', include('rest_auth.urls')),
    path('rest-auth/registration/', include('rest_auth.registration.urls')),
    path('users/', include('users.urls')),
    path('reset/<uidb64>/<token>/',
        views.PasswordResetConfirmView.as_view(template_name='account/password_reset_confirm.html', form_class=SetPasswordFormCustom),
        name='password_reset_confirm'),
    path('reset/done/', views.PasswordResetCompleteView.as_view(template_name='account/password_reset_complete.html'),
        name='password_reset_complete'),
    path('content/', include('lists.endpoints')),
    # content is a path for lists, items etc found in the lists app
]

forms.py

from django import forms
from django.contrib.auth.forms import SetPasswordForm
from django.contrib.auth import (
    authenticate, get_user_model, password_validation,
)
from django.utils.translation import gettext, gettext_lazy as _
#from django.contrib.auth import password_validation

from django.contrib.auth.forms import PasswordResetForm
UserModel = get_user_model()

class SetPasswordFormCustom(SetPasswordForm):
    new_password1 = forms.CharField(
        label=_("New password"),
        widget=forms.PasswordInput(attrs={'class':'form-control','placeholder':'Password'}),
        strip=False,
    )
    new_password2 = forms.CharField(
        label=_("Confirm new password"),
        strip=False,
        widget=forms.PasswordInput(attrs={'class':'form-control','placeholder':'Confirm password'}),
        help_text=password_validation.password_validators_help_text_html(),
    )

class PasswordResetFormCustom(PasswordResetForm):
    def get_users(self, email):
        print('using custom form');
        """Given an email, return matching user(s) who should receive a reset.

        This allows subclasses to more easily customize the default policies
        that prevent inactive users and users with unusable passwords from
        resetting their password.
        """
        active_users = UserModel._default_manager.filter(**{
            '%s__iexact' % UserModel.get_email_field_name(): email,
            'is_active': True,
        })

        if not active_users:
            raise forms.ValidationError(_("The e-mail address is not assigned to any user account"),
                code='invalid')
        return (u for u in active_users if u.has_usable_password())

Итак, я не могу понять, что PasswordResetFormCustom с его проверкой active_users не используется. Строка «с помощью пользовательской формы» не печатается в журнале сервера, когда я запрашиваю электронную почту для сброса пароля, и проверка не выполняется.

Моя другая настраиваемая форма PasswordResetConfirmView работает нормально.

Нет ошибок, поэтому импорт не является правильным.

Есть идеи, как я могу настроить метод get_users без необходимости редактировать файл django-rest-auth?

Спасибо за любую помощь!

Редактировать: я поместил код yofee в файл serializers.py, а также мне пришлось исправить порядок моих URL-путей в urls.py. Теперь это работает!

urlpatterns = [ ... путь ('rest-auth / password / reset /', PasswordResetView.as_view ()), путь ('rest-auth /', include ('rest_auth.urls')), ... ]

путь сброса должен предшествовать включению.

1 Ответ

0 голосов
/ 10 марта 2019

Решение должно быть до

  1. не установлено PasswordResetFormCustom по вашему мнению, но в вашем сериализаторе
  2. используйте rest_auth PasswordResetView (не Джанго)

Пример:

from django.contrib.auth.forms import PasswordResetForm as DjangoPasswordResetForm
from rest_auth.serializers import (
    PasswordResetSerializer as RestAuthPasswordResetSerializer
)
from rest_auth.views import PasswordResetView as RestAuthPasswordResetView


class PasswordResetForm(DjangoPasswordResetForm):
    def get_users(self, email):
        users = tuple(super().get_users(email))
        if users:
            return users
        msg = _('"{email}" was not found in our system.')
        raise ValidationError({'email': msg.format(email=email)})


class PasswordResetSerializer(RestAuthPasswordResetSerializer):
    password_reset_form_class = PasswordResetForm


class PasswordResetView(RestAuthPasswordResetView):
    serializer_class = PasswordResetSerializer

    def __init__(self, *args, **kwargs):
        """Prints the name of the class if it is used."""
        print(self.__class__.__name__)
        super().__init__(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...