+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-08(122)

2019-09(94)

2019-10(6)

2019-11(7)

2019-12(13)

2020-01(36)

2020-02(22)

用户关系模型的建立

发布于2020-02-10 17:28     阅读(73)     评论(0)     点赞(20)     收藏(0)


用户关系模型的建立

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

创建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 = [
   
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

不然就会报错。

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')),
]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

models文件

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

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

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

所用到的类介绍

先导入两个类

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

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在源码中,有一个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的方法,创建
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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'] #这个要设置成你想要默认必须输入的参数。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

我们分析一下源码,这个源码里面包含了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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

参数介绍

help_text

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

error_messages

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

Meta

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

db_table

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

verbose_name

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

最后

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

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

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

# 先
python manage.py makemigrations
# 后
python manage.py migrate
  • 1
  • 2
  • 3
  • 4

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

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

发布了7 篇原创文章 · 获赞 3 · 访问量 208


所属网站分类: 技术文章 > python文章

作者:sdhjsdh

链接: http://www.pythonheidong.com/blog/article/231018/

来源:python黑洞网 www.pythonheidong.com

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0

赞一赞 or 踩一踩

收藏该文
已收藏

评论内容:(最多支持255个字符)

相似文章

  5171. 最接近的因数

  Python实现生成西瓜数据集的Excel文件

  Leetcode - 删除排序数组中的重复项

  python第五天-字符串

  数据结构|LeetCode(力扣)经典题:队列

  python学习笔记(3)

  TYD_初识python数据可视化库-Matplotlib

  Scrapy安装与应用教程

  python实现修改文件中的内容

  mac环境下python3.6安装pyhanlp工具包

优质资源排行榜

 python经典电子书大合集下载 下载次数 8138

 零基础java开发工程师视频教程全套,基础+进阶+项目实战(152G) 下载次数 7550

 零基础前端开发工程师视频教程全套,基础+进阶+项目实战(共120G) 下载次数 7442

 零基础大数据全套视频400G 下载次数 7006

 零基础php开发工程师视频教程全套,基础+进阶+项目实战(80G) 下载次数 6893

 零基础软件测试全套系统教程 下载次数 6506

 全套人工智能视频+pdf 下载次数 6443

 IOS全套视频教程 基础班+就业班 下载次数 4680

 编程小白的第一本python入门书(高清版)PDF下载 下载次数 3648

10  effective python编写高质量Python代码的59个有效方法 pdf下载 下载次数 3361

11  Python深度学习 pdf下载 下载次数 3156

12  笨办法学python pdf下载 下载次数 3087

13  Python Cookbook第三版中文PDF下载高清完整扫描原版 下载次数 3024

14  树莓派Python编程指南 pdf下载 下载次数 3011

15  python从入门到精通视频(全60集)python视频教程下载 下载次数 3009

16  python项目开发视频 下载次数 3002

17  使用python+pygame开发的小游戏《嗷大喵快跑》源码下载 下载次数 3000

18  黑马2017年java就业班全套视频教程 下载次数 2992

19  Python基础教程 pdf下载 下载次数 2988

20  python实战项目 平铺图像板系统源码下载,适用于想要保存,标记和共享图像,视频和网页的用户 下载次数 2987

21  利用python实现程序内存监控脚本 下载次数 2987

22  老男孩python自动化视频 下载次数 2983

23  老王python基础+进阶+项目视频教程 下载次数 2974

24  尚硅谷Go学科全套视频 下载次数 2972

25  某硅谷Python项目+AI课程+核心基础视频教程 下载次数 2968

26  Web前端实战精品课程 下载次数 2967

27  Python算法教程_中文版 pdf下载 下载次数 2966

28  tron python小游戏 下载次数 2963

29  [小甲鱼]零基础入门学习Python 下载次数 2962

30  老男孩python全栈开发15期 下载次数 2958

31  2017最新web前端开发完整视频教程附源码 下载次数 2948

32  最新全套完整JAVAWEB2018开发视频 下载次数 2926

33  流畅的Python PDF下载高清完整扫描原版 下载次数 2919

34  Spring boot实战视频6套下载 下载次数 2910

35  python全套视频十五期(116G) 下载次数 2908

36  Python高性能编程 pdf下载 下载次数 2906

37  Python项目实战 下载次数 2887

38  30个小时搞定Python网络爬虫 含源码 下载次数 2884

39  简明python教程 (A Byte of Python)pdf下载 下载次数 2884

40  利用Python进行数据分析 pdf下载 下载次数 2884

41  python全自动抢火车票教程-python视频教程下载 下载次数 2883

42  尚硅谷大数据之Hadoop视频 下载次数 2876

43  Python A~B~C~ python视频教程下载 下载次数 2866

44  数据结构与算法视频(小甲鱼讲解-全) 下载次数 2864

45  web小程序表白天数倒计时源码下载 下载次数 2863

46  python基础视频教程 下载次数 2862

47  go语言全套视频 下载次数 2855

48  清华学霸尹成Python爬虫视频-ok 下载次数 2846

49  黑马前端36期最全视频和代码 下载次数 2843

50  2018最新全套web前端视频教程+源码下载 下载次数 2841