面对我的自定义登录错误

时间:2015-11-11 18:39:59

标签: django django-forms django-login

password error message

美好的一天,我有以下两个问题:

1)我正在使用django文档中显示的自定义登录,但是在尝试保存新用户时我收到错误。

这是我的forms.py:

class UserCreationForm(forms.ModelForm):
    """
    A form for creating a user, with no privileges.
    Includes all the required fields, plus a repeated password.
    """
    password1 = forms.CharField(label=_("Mot de passe"), widget=forms.PasswordInput)
    password2 = forms.CharField(
        label=_("Confirmer le mote de passe"),
        widget=forms.PasswordInput,
        help_text=_("Les deux mots de passe, doivent etre identique."))

    class Meta:
        model = IfasicUser
        fields = ("email",)

    def clean_email(self):
        email = self.cleaned_data.get('email')
        email_base, provider = email.split("@")
        domain, extension = provider.split(".")
        if not domain == "ifasic":
            raise forms.ValidationError("domain doesn't exist")
        if not extension == "cd":
            raise forms.ValidationError("Utilisateur non identifie, reessayer.")
        return email

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Les deux mots de passe, doivent etre identiques.")
        return self.clean_password2

    # TODO: make sure a student email must contains a student number as part of it.
    # def validate_email(email):
    #     if '@' not in email:
    #         raise ValidationError('Invalid email. @ not found')
    #     if '.' not in email:
    #         raise ValidationError('Invalid email. Incorrect domain?')
    #
    #     # lowercase domain
    #     name, domain = email.split('@')
    #     email = '@'.join([name, domain.lower()])
    #     return email

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class UserChangeForm(forms.ModelForm):
    """
    A form for updating a user. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    """
    password = ReadOnlyPasswordHashField(
        label=_("Password"),
        help_text=_("Raw passwords are not stored, so there is no way to see "
                    "this user's password, but you can change the password "
                    "using <a href=\"password/\">this form</a>."))

    class Meta:
        model = IfasicUser
        fields = '__all__'

    def clean_password(self):
        # Regardless of what the user provides, return the initial value.
        # This is done here, rather than on the field, because the
        # field does not have access to the initial value
        return self.initial["password"]


class MyAuthenticationForm(AuthenticationForm):
    """
    A custom authentication form that extends the base AuthenticationForm
    and overrides the username field to set it to an EmailField.
    """
    username = forms.EmailField()

2)我想根据标志is_staff将用户重定向到他的内容管理器系统。 这是我尝试过的代码。但没有结果:

  class AdminLogin(generic.TemplateView):

    model = models.Staff
    template_name = 'registration/login.html'


@sensitive_post_parameters()
@csrf_protect
@never_cache
def login(request, template_name='registration/login.html',
          redirect_field_name=REDIRECT_FIELD_NAME,
          authentication_form=AuthenticationForm,
          current_app=None, extra_context=None):
    """
    Displays the login form and handles the login action.
    """
    redirect_to = request.POST.get(redirect_field_name,
                                   request.GET.get(redirect_field_name, ''))

    if request.method == "POST":
        form = authentication_form(request, data=request.POST)
        if form.is_valid():

            # Ensure the user-originating redirection url is safe.
            if not is_safe_url(url=redirect_to, host=request.get_host()):
                redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)

            # Okay, security check complete. Log the user in.
            auth_login(request, form.get_user())
            # here where to redirect the user
            if request.user is not None:
                if request.user.is_active and request.user.is_staff:
                    redirect_to = 'home'
                    print(u'the request request.user')
            # if Student.filter(user=request.user).exists():
            #     ...

            return HttpResponseRedirect(redirect_to)
    else:
        form = authentication_form(request)

    current_site = get_current_site(request)

    context = {
        'form': form,
        redirect_field_name: redirect_to,
        'site': current_site,
        'site_name': current_site.name,
    }
    if extra_context is not None:
        context.update(extra_context)

    if current_app is not None:
        request.current_app = current_app

    return TemplateResponse(request, template_name, context)

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

1)KeyError用于密码,因为您使用的是password1和password2。一种解决方案是将字段设为密码,然后设置password_confirm。这是因为您使用的是ModelForm,因此您已经在IfasicUser中设置了密码字段。

2)在为用户设置redirect_to之后,您有另一个if语句可能会被触发并覆盖redirect_to值。因此,在这种情况下,如果用户is_staff以及学生,那么他们会重定向到学生登录后的任何地方。