django - 在 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 检查数据库后,我意识到数据库有一个空的电话号码字段用于我创建的超级用户。
所以问题是:我创建超级用户时电话号码没有正确保存
解决方案
在您的代码中,您编写:
user = self.model(phone_number)
(重新格式化)
但是,如果您创建一个模型实例,所有参数都必须命名为参数(因为字段是无序的,因此很难知道值将“降落”在哪里)。因此,您必须指定要更新的字段名称:
user = self.model(phone_number=phone_number)
推荐阅读
- python - 发出命令时如何引用外键
- c++ - (C++) 输入字符导致无限循环
- django - 模板不存在
- data-modeling - 如何制作具有“特定”要求的 erd?
- android - 如何使用“拒绝在先前失败的类上重新初始化”来抑制有关 NoClassDefFoundError 的警告?
- python-3.x - 如何在 Python 闭包中捕获值
- visual-studio-code - 如何在 VScode 中多次调用任务
- r - 从具有多个数字的单元格中获取最后一个数字
- r - 如何通过通过变量过滤的逻辑表达式进行过滤
- android - 无法加载 android 套接字类 java.lang.NoSuchMethodException:com.android.org.conscrypt.OpenSSLSocketImpl.setUseSessionTickets [boolean]