首页 > 解决方案 > 自定义用户在数据库中没有密码

问题描述

当我尝试使用我的自定义用户模型登录时,我收到了“请输入正确的电子邮件和密码。两个地方都要注意大小写。'。当我检查数据库时,我看到超级用户有密码,但我的测试用户没有。

我尝试过的事情:

帐户/模型.py

from django.db import models
from django.contrib.auth.models import (
    AbstractBaseUser, 
    BaseUserManager,
    PermissionsMixin,
)

# Create your models here.


class UserManager(BaseUserManager):
    def create_user(self, email, first_name, last_name, company, phone, is_active=True, is_admin=False, is_staff=False, is_dealer=False, password=None):
        if not email:
            raise ValueError("Users must have an email address")
        if not password:
            raise ValueError("Users must have a password")
        if not first_name:
            raise ValueError("Users must have a first name")
        if not last_name:
            raise ValueError("Users must have a last name")
        if not company:
            raise ValueError("Users must have a company")
        if not phone:
            raise ValueError("Users must have a phone number")
        user_obj = self.model(
            email = self.normalize_email(email)
        )
        user_obj.set_password(password)
        user_obj.first_name = first_name
        user_obj.last_name = last_name
        user_obj.company = company
        user_obj.phone = phone
        user_obj.admin = is_admin
        user_obj.staff = is_staff
        user_obj.dealer = is_dealer
        user_obj.active = is_active
        user_obj.save(using=self._db)
        return user_obj

    def create_superuser(self, email, first_name, last_name, company, phone, password=None):
        user = self.create_user(
            email,
            first_name,
            last_name,
            company,
            phone,
            password=password,
            is_admin=True,
            is_staff=True
        )
        return user

    def create_company_staff_user(self, email, first_name, last_name, company, phone, password=None):
        user = self.create_user(
            email,
            first_name,
            last_name,
            company,
            phone,
            password=password,
            is_staff=True
        )
        return user
    
    def create_dealer_user(self, email, first_name, last_name, company, phone, password=None):
        user = self.create_user(
            email,
            first_name,
            last_name,
            company,
            phone,
            password=password,
            is_dealer=True
        )
        return user


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255, blank=True, null=True)
    last_name = models.CharField(max_length=255, blank=True, null=True)
    company = models.CharField(max_length=255, blank=True, null=True)
    phone = models.CharField(max_length=255, blank=True, null=True)
    active = models.BooleanField(default=True) # can login
    online = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)
    staff = models.BooleanField(default=False)
    dealer = models.BooleanField(default=False)
    timestamp = models.DateTimeField(auto_now_add=True)
    
    USERNAME_FIELD = 'email'
    # USERNAME_FIELD and password are required by default
    REQUIRED_FIELDS = ['first_name', 'last_name', 'company', 'phone']

    objects = UserManager()

    def __str__(self):
        return f"{self.first_name} {self.last_name}"

    def get_full_name(self):
        return f"{self.first_name} {self.last_name}"

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_dealer(self):
        return self.dealer  

    @property
    def is_active(self):
        return self.active

    @property
    def is_online(self):
        return self.online  

帐户/admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model

# Register your models here.

User = get_user_model()

admin.site.register(User)

设置.py

AUTH_USER_MODEL = 'accounts.User'

主/模板/注册/login.html

<div class="container">
  <div class="card my-4">
    {% load static %}
    <img class="img-fluid pb-4" src="{% static 'img/logos/logo-black.png' %}">

    {% if form.errors %}
    <p>Your username and password didn't match. Please try again.</p>
    {% endif %}

    {% if next %}
    {% if user.is_authenticated %}
    <p>Your account doesn't have access to this page. To proceed,
      please login with an account that has access.</p>
    {% else %}
    <p>Please login to see this page.</p>
    {% endif %}
    {% endif %}

    <form method="post" action="{% url 'login' %}">
      {% csrf_token %}
      {{ form|crispy }}
      <button type="submit" class="btn btn-success"><i class="fas fa-sign-in-alt"></i> Login</button>
      <input type="hidden" name="next" value="{{ next }}" />
    </form>
  </div>
</div>

我的项目/urls.py

urlpatterns = [
    path("", include('main.urls')),
    path('accounts/', include('django.contrib.auth.urls')), 
    path('admin/', admin.site.urls),
]  + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我不知道还能尝试什么。我所需要的只是能够使用电子邮件而不是用户名登录并拥有两种类型的用户。(员工和经销商)

编辑:我刚刚检查了我的数据库,看来我的测试用户没有密码。

标签: djangodjango-modelsdjango-formsdjango-viewsdjango-templates

解决方案


UserAdmin您应该使用auth 包中的注册您的用户模型。它应该只插入您的模型,并为您提供正确创建用户的自定义表单

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin

User = get_user_model()

admin.site.register(User, UserAdmin)

推荐阅读