[py][mx]django项目-让系统用自定义的users表认证

项目开端

参考的是mxonline项目

先把这两项完成

  • 1.app设计
  • 2.app的models的设计

经过分析系统有四个模块

users       - 用户管理
course      - 课程管理
oranization - 授课教师&授课机构
operation   - 用户操作管理


一般系统都先设计用户模块, 把较为独立的模块也放在users模块

先设计user模块

- 用户详情里的字段有
  image
  nick_name
  gender
  brith
  mobile
  address

django默认自带用户表的字段无法满足,因此需要继承它并做扩展,让系统用我们继承过来的.

完成项目初始化

  • 创建项目
  • 创建app users
  • 写models修改认证表为自己的表

users/models.py

- 其中birthday字段类型是DateField
- gender是choices形式
- image头像是ImageField类型,并设置默认头像
- 修改表字段名称显示verbose_name
- 修改表名显示Meta


- 这里继承AbstractUser表, 可以查看AbstractUser类,里面的字段正是系统默认的


import django.contrib.auth.models import AbstractUser # 定义了django默认的model

class UserProfile(AbstractUser):
    image = models.ImageField(upload_to="image/%Y/%m", default="image/default.png", max_length=100)
    nick_name = models.CharField(max_length=50, verbose_name="昵称", default="")
    gender = models.CharField(max_length=5, choices=(("male", "男"), ("female", "女")), default="female")
    birthday = models.DateField(verbose_name="生日", null=True, blank=True)
    mobile = models.CharField(max_length=11, verbose_name="手机", null=True, blank=True)
    address = models.CharField(max_length=50, verbose_name="地址", default="")

    class Meta:
        verbose_name = "用户信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

  • 修改settings.py,让django使用我们扩展的表.
app名字.对应model的class名

AUTH_USER_MODEL = "users.UserProfile"
  • 同步数据库,观察users表

循环引用问题

- 已经确定4个模块
users
courses
organization
operation


- 循环引用
users:   用户课程  有这个字段
courses: 课程评论  有这个字段

彼此又要互相引用

user    外键 课程评论
courses 外键 用户课程

会造成循环引用问题,利用model分层设计解决



- model分层设计: 防止循环引用
3者之间的共同关系通过operation model来关联.
        operation
___________|____________
|          |            |
users    courses    organization

邮箱验证码和广告条的model设计

users/models.py

- 较底层的model都放到users模型当中,如邮箱验证码,和广告条较为独立
- send_type是选择类型
- 发送邮件有时间,注意是datetime.now,发送时系统时间.没括号
- 轮播图需要地址URLField类型和前后顺序IntegerField


class EmailVerifyRecord(models.Model):
    code = models.CharField(max_length=10, verbose_name="验证码")
    email = models.EmailField(max_length=50, verbose_name="邮箱")
    send_type = models.CharField(choices=(("register", "注册"), ("forget", "忘记密码")), max_length=10)
    send_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = "邮箱验证码"
        verbose_name_plural = verbose_name


class Banner(models.Model):
    title = models.CharField(max_length=100, verbose_name="标题")
    image = models.ImageField(upload_to="banner/%Y/%m", verbose_name="轮播图")
    url = models.URLField(max_length=200, verbose_name="访问地址")
    index = models.IntegerField(default=200, verbose_name="顺序")
    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")

    class Meta:
        verbose_name = "轮播图"
        verbose_name_plural = verbose_name

表的字段小结

userprofile:
    image
    nickname
    gender
    tel
    address

emailrecord:
    code
    email
    send_type
    send_time

banner:
    name
    url
    index
    add_time
posted @ 2018-01-22 21:40  mmaotai  阅读(222)  评论(0编辑  收藏  举报