+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-08(122)

2019-09(94)

2019-10(6)

2019-11(7)

2019-12(13)

用户关系模型的建立

发布于2020-02-10 17:28     阅读(180)     评论(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


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

作者:sdhjsdh

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

来源: python黑洞网

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

20 0
收藏该文
已收藏

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