首页 > 解决方案 > 在 django 中创建超级用户

问题描述

我修改了用户模型如下图,让用户通过电话登录。

from django.db import models
import datetime
from django.core.mail import send_mail
from django.contrib.auth.models import (
    AbstractBaseUser, BaseUserManager
)
from django.contrib.staticfiles.templatetags.staticfiles import static

from django.core.validators import RegexValidator



class UserManager(BaseUserManager):

def get_by_natural_key(self, username):
    case_insensitive_username_field = '{}__iexact'.format(self.model.USERNAME_FIELD)
    return self.get(**{case_insensitive_username_field: username})

def create_user(self,phone_number,password=None,is_staff=False,is_active = True, is_admin = False, is_vendor = False):

    if not phone_number:
        raise ValueError("Users Must Have a phone number")
    if not password:
        raise ValueError("Users must have a password")
    user = self.model(
        phone_number )

    user.set_password(password)
    user.is_staff = is_staff
    user.is_active = is_active
    user.is_admin = is_admin
    user.is_vendor = is_vendor
    user.save(using=self._db)
    return user

def create_staffuser(self,phone_number, password=None):
    user = self.create_user(
    phone_number,
    password=password,
    is_staff=True
    )
    return user
def create_superuser(self,phone_number, password=None):
    user = self.create_user(
    phone_number,
    password=password,
    is_admin=True,
    is_staff=True
    )
    return user
def create_vendoruser(self,phone_number, password=None):
    user = self.create_user(
    phone_number,
    password=password,
    is_vendor=True
    )
    return user



class User(AbstractBaseUser):
    phone_number = models.CharField(max_length=20, unique=True)
    date_joined = models.DateField(auto_now_add = True)
    is_active = models.BooleanField(default = True)
    is_staff = models.BooleanField(default = False)
    is_admin = models.BooleanField(default = False)
    is_vendor = models.BooleanField(default = False)
    is_basic = models.BooleanField(default = False)

 REQUIRED_FIELDS = []

objects = UserManager()

def __str__(self):
    return self.phone_number

# def save(self, *args, **kwargs):
#     self.email = self.email.lower()
#     return super(User, self).save(*args, **kwargs)

def get_full_name(self):
    return self.phone_number

def get_short_name(self):
    return self.phone_number

def has_perm(self, perm, obj=None):
    return True

def has_module_perms(self, app_label):
    return True

def get_type(self):
    if self.vendor:
        return self.vendor_user
    else:
        return self.basic_user

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

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

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

@property
def vendor(self):
    return self.is_vendor

@property
def basic(self):
    return self.is_basic




USERNAME_FIELD = 'phone_number'

然后我创建了一个超级用户并尝试登录,但无法登录。从 python shell 检查数据库后,我意识到数据库有一个空的电话号码字段用于我创建的超级用户。

所以问题是:我创建超级用户时电话号码没有正确保存

标签: djangoauthenticationdjango-models

解决方案


在您的代码中,您编写:

user = self.model(phone_number)

(重新格式化)

但是,如果您创建一个模型实例,所有参数都必须命名为参数(因为字段是无序的,因此很难知道值将“降落”在哪里)。因此,您必须指定要更新的字段名称:

user = self.model(phone_number=phone_number)

推荐阅读