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

Python 对于非超级用户,Django身份验证总是错误的,python,django,authentication,Python,Django,Authentication,问题是,我试图为我的网站对用户进行身份验证,但authenticate()始终为注册页面创建的用户返回None值。我可以在用户创建后正确记录用户,并且条目位于数据库中。我有一个自定义的用户模型扩展表单AbstractBaseUser。下面是代码不起作用的部分: from django.contrib.auth import login as authlog def login(request): error = False if request.method == "

问题是,我试图为我的网站对用户进行身份验证,但
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)
关于清理后的数据,我记录了为调试目的而获取的数据,它们是正确的

编辑2:我的用户模型

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

您的表单有缩进问题。您的
save
方法(以及
clean_pass2
方法)在内部元类中缩进错误,因此表单本身不会看到它。这意味着在创建用户时不会调用
set\u password
,因此不会对密码进行哈希运算


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

请显示您的
注册表执行。
。这到底应该做什么
if form.is_valid():user=form.save()
您可能想使用类似于
获取清理数据
…@hansefranz的代码,这是a的标准代码。您能显示您的models.py吗?这是您的实际缩进(在表单中)?这似乎是逻辑,但现在我有一个错误,我不明白(很抱歉,这是我第一个python项目之一)
文件/home/thor/projects/bdewebsite/users/forms.py”,第24行,在save if user.exte:AttributeError:“super”对象没有属性“exte”
您的语法错误;您需要调用super:
user=super(UserCreationForm,self)。save(commit=False)
。另外请注意,您不需要调用
user.save(commit=False)
。谢谢我刚刚找到了解决方案:D您解决了问题,我两天来一直在忙。非常感谢您:D