用户登录系统的问题

问题描述 投票:0回答:1

我创建了两个基于 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': 'Дата народження'
}
django django-views
1个回答
0
投票

我认为问题在于您用户的

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
这样的行,它应该同样有效。

© www.soinside.com 2019 - 2024. All rights reserved.