对于非超级用户,Django身份验证总是错误的

时间:2017-07-16 15:20:51

标签: python django authentication

这是我尝试为我的网站验证用户的麻烦,但authenticate()总是返回使用注册页面创建的用户的None值。我可以在用户用户创建后正确记录用户,并且该条目位于数据库中。我有一个自定义用户模型扩展表单AbstractBaseUser。所以这里的代码部分不起作用:

from django.contrib.auth import login as authlog

    def login(request):
    error = False

    if request.method == "POST":
        form = forms.LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password"]
            user = authenticate(username=username, password=password)

            print("Validated form.")
            print(username)
            print(password)
            print(user)

            if user:
                print("Logged user.")
                authlog(request, user)
                return redirect(to='home')
            else:
                print("Not logged user.")
                error = True
    else:
        form = forms.LoginForm()

    return render(request, 'users/login.html', locals())

在下面的代码块中,用户在注册后会被大量记录。

from django.contrib.auth import login as authlog

def register(request):
    form = forms.RegisterForm(request.POST or None)

    if form.is_valid():
        user = form.save()
        authlog(request, user)
        return redirect(to='home')


print('Registered new user')
return render(request, 'users/register.html', locals())

我不明白的是为什么我用./manage.py createsuperuser创建的管理员帐户而不是其他人。 此外,我无法在管理面板中创建用户,我也不知道原因。

谢谢:D

编辑:我的表格

class CreateUserForm(forms.ModelForm):
    pass1 = forms.CharField(label="Password", widget=forms.PasswordInput)
    pass2 = forms.CharField(label="Password Check", widget=forms.PasswordInput)

    class Meta:
        model = models.User
        fields = '__all__'

        def clean_pass2(self):
            pass1 = self.cleaned_data.get('pass1')
            pass2 = self.cleaned_data.get('pass2')
            if pass1 and pass2 and pass1 != pass2:
                raise forms.ValidationError("Passwords don't match")

            return pass2

        def save(self, commit=True):
            user = super(UserCreationForm, self)
            if user.exte:
                user.promo = None
                user.login = None
            user.save(commit=False)
            user.set_password(self.cleaned_data["pass1"])
            if commit:
                user.save()
            return user

class RegisterForm(CreateUserForm):
    class Meta:
        model = models.User
        fields = ('email', 'lname', 'fname', 'exte', 'promo', 'login')

class LoginForm(forms.Form):
    username = forms.EmailField(label='Email')
    password = forms.CharField(label='Mot de passe', widget=forms.PasswordInput)

关于清理过的数据我记录了我为调试目的而获得的数据,他们是对的。

EDIT2:我的用户模型

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True,  verbose_name='e-mail')
    fname = models.CharField(max_length=64, verbose_name='first name', null=False, blank=False)
    lname = models.CharField(max_length=64, verbose_name='last name', null=False, blank=False)
    login = models.CharField(max_length=64, null=True, blank=True, verbose_name="login")
    promo = models.CharField(max_length=64, null=True, blank=True, verbose_name="promotion")
    exte  = models.BooleanField(default=False, verbose_name="externe")
    joined = models.DateTimeField(auto_now_add=True)
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
    is_active = models.BooleanField(default=True, verbose_name='active user')
    is_staff = models.BooleanField(default=False, verbose_name='admin user')

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['fname', 'lname']

    def get_full_name(self):
        return "{0} {1}".format(self.fname, self.lname)

    def get_short_name(self):
        return self.lname

    def __str__(self):
        return self.get_full_name()

    def has_perm(self, perm, obj=None):
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        # Simplest possible answer: Yes, always
        return True

1 个答案:

答案 0 :(得分:0)

您的表单上有缩进问题。您的save方法(以及clean_pass2方法)在内部Meta类中被错误地缩进,因此它不会被表单本身看到。这意味着在创建用户时不会调用set_password,因此密码不会被哈希。

将这些方法向左移动一个缩进。