我创建了两个基于 UserCreationForm 和 AuthenticationForm 的自定义表单。注册用户后,我想立即让他登录,我成功了。但是当我只想登录时,出现错误 {'invalid_login': '请输入正确的 %(用户名)s 和密码。请注意,两个字段都可能区分大小写。', 'inactive': '此帐户处于非活动状态。'}即使所有输入的数据都是正确的。
模型.py
class User(AbstractUser):
profile_image = models.ImageField(upload_to='accounts/images', default='default/user.jpg', blank=True, null=True)
address = models.CharField(max_length=130, null=True, blank=True)
date_of_birth = models.DateField(null=True, blank=True)
def __str__(self) -> str:
return f"{self.username}, {self.email}"
表格.py
class LoginForm(AuthenticationForm):
class Meta:
model = User
fields = ['username', 'password']
labels = {
'username': "Username",
'password': 'Password'
}
views.py
class RegisterView(View):
def get(self, request):
form = RegisterForm()
return render(request, 'accounts/register.html', {'form': form})
def post(self, request):
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password2')
user.set_password(raw_password)
user.save()
# Додайте логування для перевірки, чи користувач збережений
# print(f"User {username} saved successfully.")
authenticated_user = authenticate(username=username, password=raw_password)
if authenticated_user is not None:
login(request, authenticated_user)
return redirect('blog:index')
print(f"Form errors: {form.errors}")
return render(request, "accounts/register.html", {'form': form})
class LoginView(View):
def get(self, request):
form = LoginForm()
return render(request, 'accounts/login.html', {'form': form})
def post(self, request):
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
print(f"User {username} login successfully.")
return redirect('blog:index')
print(f"Form errors: {form.error_messages}")
return render(request, 'accounts/login.html', {'form': form})
模板登录.html
{% extends 'base.html' %}
{% block title %}
Login user
{% endblock %}
{% block content %}
<div>
<form action="" method="post">
{% csrf_token %}
{{ form }}
<br>
<button type="submit">Log in</button>
</form>
</div>
{% endblock %}
登记表
class RegisterForm(UserCreationForm):
profile_image = forms.ImageField(required=False)
address = forms.CharField(max_length=130, required=False)
date_of_birth = forms.DateField(required=False)
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2',
'profile_image', 'address', 'date_of_birth']
labels = {
'username': "Ім'я користувача",
'email': 'Електронна пошта',
'password1': 'Пароль',
'password2': 'Підтвердження пароля',
'profile_image': 'Ваше фото',
'address': 'Адреса проживання',
'date_of_birth': 'Дата народження'
}
我认为问题在于您用户的
is_active
属性。由于您没有使用django提供的超级简单的create_user
函数,因此您的代码无法设置<youruser>.is_active = True
。
默认的 ModelBackend 不允许这些用户登录。请阅读更多相关信息这里。
试试这个:
class RegisterView(View):
def post(self, request):
form = RegisterForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password2')
user = create_user(
username=username,
password=password,
yourfield1=yourdata1,
yourfield2=yourdata2,
)
user.save()
# [...]
当然,您也可以简单地在代码中添加像
user.is_active = True
这样的行,它应该同样有效。