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