Django 验证用户登录后不起作用

Django authenticate user does not work after logging in

我正在尝试使用自定义用户模型和自定义登录模板在 Django 中创建基于会话的自定义登录。

出于某些原因,它起初有效,但现在 django.contrib.auth 中的身份验证方法未对用户进行身份验证。当它起作用时,登录和注册按钮被隐藏了。

users/urls.py

app_name = 'users'
urlpatterns = [
    path('login/', login_user, name='login_user'),
    path('logout/', logout_user, name='logout_user'),
]

users/views.py

app_name = 'users'
def login_user(request):
    django_logout(request)
    message = ''
    if request.method == 'POST':
        email = request.POST['email']
        password = request.POST['password']
        user = authenticate(request, email=email, password=password)
        if user is not None:
            django_login(request, user)
            return redirect('homepage')
        else:
            message = "Log in failed!"
            messages.error(request, message)
            return redirect('users:login_user')
    else:
        return render(request, 'users/login.html')

@login_required(login_url='users/login/')
def logout_user(request):
    django_logout(request)

templates/users/login.html

<form class="bg-white rounded-5 shadow-5-strong p-5" method="post" action="/">
            {% csrf_token %}
            
          <!-- Email input -->
          <div class="form-outline mb-4">
            <label class="form-label" for="form1Example1">Email address</label>
            <input type="email" name="email" id="form1Example1" class="form-control" />
            
          </div>

          <!-- Password input -->
          <div class="form-outline mb-4">
            <label class="form-label" for="form1Example2">Password</label>
            <input type="password" type="password" id="form1Example2" class="form-control" />
            
          </div>

          <!-- Submit button -->
          <button type="submit" class="btn btn-primary btn-block">Sign in</button>
</form>

users/models.py

class CustomUserManager(BaseUserManager):
    def create_superuser(self, email, password):
        if email is None:
            raise TypeError('Users should have an Email')
        if password is None:
            raise TypeError('Password should not be none')
        user = self.create_user(email, password)
        user.is_superuser = True
        user.is_staff = True
        if user.is_superuser is not True:
            raise ValueError(
                'Superuser must be assigned to is_staff=True.')
        if user.is_staff is not True:
            raise ValueError(
                'Superuser must be assigned to is_superuser=True.')
        user.save()
        return user
    
    
    def create_user(self, email, password):
        if email is None:
            raise TypeError('Users should have an Email')
        if password is None:
            raise TypeError('Users must have a password')
        email = self.normalize_email(email)
        user = self.model(email=email)
        user.set_password(password)
        user.save()
        return user

    

AUTH_PROVIDERS = {'facebook': 'facebook', 'google': 'google',
                  'twitter': 'twitter', 'email': 'email'}
class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True, db_index=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    about = models.TextField(_(
        'about'), max_length=500, blank=True)
    auth_provider = models.CharField(
        max_length=255, blank=False,
        null=False, default=AUTH_PROVIDERS.get('email'))
    USERNAME_FIELD = 'email'
    objects = CustomUserManager()

    def __str__(self):
        return self.email

我的登录按钮在 homepage.html

<a href="{% url 'users:login_user' %}">
          <button type="button" class="btn btn-link px-3 me-2">
            Login
          </button>
</a>

你能告诉我解决这个问题的方法吗?谢谢!

像这样改变你的形式

<form class="bg-white rounded-5 shadow-5-strong p-5" method="post" action="{% url 'users:login_user' %}">
            {% csrf_token %}
            
          <!-- Email input -->
          <div class="form-outline mb-4">
            <label class="form-label" for="form1Example1">Email address</label>
            <input type="email" name="email" id="form1Example1" class="form-control" />
            
          </div>

          <!-- Password input -->
          <div class="form-outline mb-4">
            <label class="form-label" for="form1Example2">Password</label>
            <input type="password" name="password" type="password" id="form1Example2" class="form-control" />
            
          </div>

          <!-- Submit button -->
          <button type="submit" class="btn btn-primary btn-block">Sign in</button>
</form>

MultiValueDictKeyError at /users/login/ 'password'

这是因为您正尝试通过这样的请求访问密码值 request.POST['password'] 但您没有为您的输入(密码)设置名称,这就是它给您错误的原因