用户关系模型的建立

用户关系模型的建立

上次我们搭建了环境,这次,我们创建用户表和超级管理员。

创建app(user)

  1. 我们cd到apps这个文件目录下,在ubantu的终端中打入命令django-admin startapp <appname>,一定要注意,打这个命令的时候有两个条件,**一个是在apps这个文件目录下,另一个就是用的专用的虚拟环境,**不然都创建不了app。
  2. 然后在生成的user中创建一个python文件,命名是urls。
  3. 在settings里面的INSTALLED_APPS里面注册app,就是把它的名字加上,然后,去主项目的urls里面,导入include这个方法,再将原来我们创建好的文件url拼接上去。

注意,user app里面的urls必须是这样的格式:

from django.urls import path
from user import views
app_name = 'user'
urlpatterns = [
   
]

不然就会报错。

from django.urls import path,include

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('',include('user.urls')),
    # path('user/', include('user_m.urls')),
    # path('', include('verifications.urls')),
]

models文件

我们在models文件里面创建我们要的用户模型。

用户模型我设计成两个,一个是普通用户,一个是超级用户。

django自带用户模型,但是根据我们中国人的习惯,通常用手机号注册为主,邮箱是可有可无的,所以,我要改一下django的代码结构,变成我们想要的。

所用到的类介绍

先导入两个类

from django.contrib.auth.models import AbstractUser,UserManager as _UserManager
from django.db import models

UserManager

    def create_superuser(self, username, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(username, email, password, **extra_fields)

在源码中,有一个create_superuser属性,这个是创建超级管理员,我们要将里面传参的email改成email=None使它默认为空,这样就可以了。同时,我们要初始化父类的方法,在models里面修改的代码如下:

class UserManager(_UserManager):
    """
    define user manager for modifing 'no need email'
    when 'python manager.py createsuperuser '

    """

    def create_superuser(self, username, password, email=None, **extra_fields):#用原来的类去传递自身定义的参数
            super().create_superuser(username=username,password=password, email=email, **extra_fields)#继承了super的方法,创建

AbstractUser

源码:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    email = models.EmailField(_('email address'), blank=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email'] #这个要设置成你想要默认必须输入的参数。

我们分析一下源码,这个源码里面包含了username并且它是唯一的,还有first_name,last_name,但是他们默认空白是可以的,就是那个blank=True参数。我们看最下面,有一个REQUIRED_FIELDS,这个就是我们要改的内容,我们先在代码中添加mobile字段,再把它在我们的代码中改成mobile,其它不动。

代码如下:

class User(AbstractUser):

    objects = UserManager()#创建一个代理管理器

    REQUIRED_FIELDS = ['mobile']#这个是必须要加上去的,不然会默认指定
    mobile = models.CharField(max_length=11,unique=True,verbose_name='手机号',help_text='手机号',error_messages={'unique':'此手机号已经注册'})
    email_ac = models.BooleanField(default=False,verbose_name='邮箱状态')
    class Meta:
        db_table = 'tb_users'
        verbose_name = '用户'


    def __str__(self):
        return self.username

参数介绍

help_text

这个是帮助性文字,用来提示用户。

error_messages

是指定的报错信息,为之后注册的时候打下铺垫。给js用的。

Meta

这是一个抽象类,用来补充该类的参数,在生成模型的时候不会被实例化成对象。、

db_table

这个是给数据库中的模型取个别名,方便查看和管理,不然django会根据驼峰命名规则给你自动生成一个。

verbose_name

给Model去一个方便阅读的名字,这个是方便后台管理取得名字。

最后

当所有都做好之后,我们不能直接迁移,还需要最最最关键的一步,这一步没弄好,前面的都是瞎搞,这一步就是在settings文件里面,指定替换的用户模型类,在settings里面最好在最后,添加:

AUTH_USER_MODEL = 'user.User'  # 指定替换的用户模型类,这个User就是我们的类名!!!

然后在项目目录下在cmd中执行操作:

# 先
python manage.py makemigrations
# 后
python manage.py migrate

第二种,直接在pycharm中Tools这一栏,点击 Run manage.py Task,然后直接先输入makemigrations,然后再输入migrate。最后查看数据库,会发现,多了很多的表,这些表是正常的,是django自带的用户系统,我们只需要查看我们的tb_users在不在里面就行。

最后的最后,在刚刚开启的命令端输入,createsuperuser,创建我们第一个管理员吧。

发布了22 篇原创文章 · 获赞 20 · 访问量 741

猜你喜欢

转载自blog.csdn.net/qq_43596002/article/details/104239349
今日推荐