赞
踩
在完成了之前的事情之后,接下来就是实现注册功能了。
判断用户名是否为空,是否已注册
判断邮箱是否为空,是否已注册
判断密码是否为空,格式是否正确确认密码
的输入,所以我们会在前端中增加一列。
判断确认密码与密码是否相同
请求方法:POST
url定义:/register/
请求参数:url路径参数
参数 | 类型 | 前端是否必须传 | 描述 |
---|---|---|---|
username | 字符串 | 是 | 用户输入的用户名 |
password | 字符串 | 是 | 用户输入的密码 |
password_repeat | 字符串 | 是 | 用户输入的重复密码 |
字符串 | 是 | 用户输入的邮箱地址 |
注:由于是post请求,在向后端发起请求时,需要附带csrf token
加入我们需要完成注册,那就需要把这三个字段username
,password
,email
存入到数据库中
创建数据库,设计表结构和字段
使用 MySQLdb 来连接数据库,并编写数据访问层代码
业务逻辑层去调用数据访问层执行数据库操作
ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first)
也就是说django与数据库的交互被写在了黑盒子里面了,如果我们要用只需要知道输入,不用管黑盒子是MySQL、Oracle、sqlite还是其他乱七八糟的数据库,它都会按照我们的需求输出正确的操作。
apps/login/models.py
开始编写数据库相关约束。
- 1id = models.AutoField()
- 2username = models.CharField()
- 3password = models.CharField()
- 4email = models.EmailField()
了解一下常用的类型,接触过数据库的应该都知道
IntegerField
: 整型,映射到数据库中的int类型。
CharField
: 字符类型,映射到数据库中的varchar类型,通过max_length指定最大长度。
TextField
: 文本类型,映射到数据库中的text类型。
BooleanField
: 布尔类型,映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField。
DateField
: 日期类型,没有时间。映射到数据库中是date类型,
DateTimeField
: 日期时间类型。映射到数据库中的是datetime类型,
但是写了这些还不够的,因为用户名,密码,邮箱等都需要进行一定的约束,id一般是作为主键from django.contrib.auth.models import AbstractUser
按住ctrl+AbstractUser跳进去。
- 1class AbstractUser(AbstractBaseUser, PermissionsMixin):
- 2 """
- 3 An abstract base class implementing a fully featured User model with
- 4 admin-compliant permissions.
- 5
- 6 Username and password are required. Other fields are optional.
- 7 """
- 8 username_validator = UnicodeUsernameValidator()
- 9
- 10 username = models.CharField(
- 11 _('username'),
- 12 max_length=150,
- 13 unique=True,
- 14 help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
- 15 validators=[username_validator],
- 16 error_messages={
- 17 'unique': _("A user with that username already exists."),
- 18 },
- 19 )
- 20 first_name = models.CharField(_('first name'), max_length=30, blank=True)
- 21 last_name = models.CharField(_('last name'), max_length=150, blank=True)
- 22 email = models.EmailField(_('email address'), blank=True)
- 23 is_staff = models.BooleanField(
- 24 _('staff status'),
- 25 default=False,
- 26 help_text=_('Designates whether the user can log into this admin site.'),
- 27 )
- 28 is_active = models.BooleanField(
- 29 _('active'),
- 30 default=True,
- 31 help_text=_(
- 32 'Designates whether this user should be treated as active. '
- 33 'Unselect this instead of deleting accounts.'
- 34 ),
- 35 )
- 36 date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
- 37
- 38 objects = UserManager()
- 39
- 40 EMAIL_FIELD = 'email'
- 41 USERNAME_FIELD = 'username'
- 42 REQUIRED_FIELDS = ['email']
- 43
- 44 class Meta:
- 45 verbose_name = _('user')
- 46 verbose_name_plural = _('users')
- 47 abstract = True
- 48
- 49 def clean(self):
- 50 super().clean()
- 51 self.email = self.__class__.objects.normalize_email(self.email)
- 52
- 53 def get_full_name(self):
- 54 """
- 55 Return the first_name plus the last_name, with a space in between.
- 56 """
- 57 full_name = '%s %s' % (self.first_name, self.last_name)
- 58 return full_name.strip()
- 59
- 60 def get_short_name(self):
- 61 """Return the short name for the user."""
- 62 return self.first_name
- 63
- 64 def email_user(self, subject, message, from_email=None, **kwargs):
- 65 """Send an email to this user."""
- 66 send_mail(subject, message, from_email, [self.email], **kwargs)
在变成我们自己的代码之前先了解以下里面的东西吧:
primary_key: 指定是否为主键。
unique: 指定是否唯一。
null: 指定是否为空,默认为False。
blank: 等于True时form表单验证时可以为空,默认为False。
default: 设置默认值。
DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及TimModel.save()方法才会调用e类才有的。
DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值创建时间
,更新时间
。而且这两个内容在全部表中都可以被应用到。所以我们封装一个基类好了。
- 1from django.db import models
- 2
- 3class ModelBase(models.Model):
- 4 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
- 5 update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
- 6 is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
- 7
- 8 class Meta:
- 9 # 为抽象模型类,用于其他模型来继承,数据库迁移时不会创建ModelBase表
- 10 abstract = True
所以我们的用户表的model文件就是:
- 1from django.db import models
- 2
- 3from utils.models import ModelBase
- 4
- 5
- 6class User(ModelBase):
- 7 id = models.AutoField(primary_key=True)
- 8 username = models.CharField(
- 9 max_length=30,
- 10 unique=True,
- 11 )
- 12 password = models.CharField(
- 13 max_length=30,
- 14 )
- 15 email = models.EmailField()
- 16
- 17 class Meta:
- 18 ordering = ['-update_time', '-id']
- 19 db_table = "tb_user" # 指明数据库表名
- 20
- 21 def __str__(self): # 这个__str__方法的作用将在查询时看到
- 22 return f'User<id={self.id},username={self.username},email={self.email}'
表名为tb_user
Run manage.py Task...
makemigrations login
migrate login
models
之后在使用
makemigrations [app name]
和
migrate [app name]
就可以修改表结构了。以后出问题了再改好了,问题驱动开发是比较合理的模式,毕竟在一开始就面面俱到难度不是一般的大。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。