写在前面:
由于作者仅仅是自学,且是独自做这个项目,代码中出现不少漏洞、错误、累赘或常识问题是难免的,作者也在不断努力学习中,请各位看官多提意见,轻喷~
基本信息
1. 项目环境
Python 3.10.7
Django 4.2
编辑器:VSCode
操作系统:Windows 10
2. 项目背景
正好近一段时间在自学 Django,突发奇想不妨试着做个个人网站练练手吧~
3. 项目构思
暂定为:登录系统 + 个人主页 + 个人博客 + 个人作品
项目代码
今天的任务是做完登录系统的模型 ~
1. 新建项目
(本文默认 Python, Django 等都已安装完毕)
找一个合适的地址,打开 cmd,输入
django-admin startproject 你的项目名称
这里我的项目名称是 LZLBlog
刚创建的项目结构如下 ——
此时可以在 cmd 中输入
python manage.py runserver
接着可以看到下面的提示,这说明 Django 的开发服务器已经开始提供Web服务了 ~
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 25, 2023 - 11:43:00
Django version 4.2, using settings 'LZLBlog.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
打开浏览器,输入 http://127.0.0.1:8000/ ,如果你看到如下界面,那么准备工作就正确完成啦
2. 新建应用
打开 cmd,输入
django-admin startapp 你的应用名称
这里因为是登录系统,所以我的应用名称是 login
注意:一定要在 刚才新建的项目文件夹中 新建应用!
新建后项目目录如下 ——
3. 创建模型
首先,作为一个登录系统,用户模型是必不可少的,因此我们先把用户模型写好
打开 LZLBlog/login/models.py
from django.db import models
from imagekit.models import ProcessedImageField
from imagekit.processors import ResizeToFill
# Create your models here.
class User(models.Model):
name = models.CharField(max_length=128, unique=True)
password = models.CharField(max_length=256)
email = models.EmailField(unique=True)
avatar = ProcessedImageField(upload_to='login/avatar', default="login/avatar/default_man.png", processors=[ResizeToFill(100,100)])
c_time = models.DateTimeField(auto_now_add=True)
has_confirmed = models.BooleanField(default=False)
no_comment = models.BooleanField(default=False)
loved_blog = models.TextField(null=True, blank=True)
small_description = models.CharField(max_length=256, default="这个人很懒,什么都没有写~")
big_detail = models.TextField(default="<p>这个人很懒,什么都没有写~</p>")
def __str__(self):
return self.name
class Meta:
ordering = ['-c_time']
verbose_name = "用户"
verbose_name_plural = "用户"
注意:这里面有一个新模块 django-imagekit,需要先使用 pip 安装一下
在 cmd 中输入如下内容安装此模块即可
pip install django-imagekit
代码注释:
用户本身的信息
1. name:用户名,unique=True 表示不允许出现重复用户名
2. password:用户密码,注意 max_length 要开大一些,因为储存的是加密的密码,长度较大
3. email:用户邮箱,unique=True 表示不允许出现重复邮箱
4. avatar:用户头像,用到了刚安装的 imagekit,这里需要在 settings.py 配置 media,稍后处理
- upload_to 表示头像图片上传到哪里
- default 表示默认的头像图片,稍后处理
- ResizeToFill 表示将图片压缩到 100*100 的尺寸
5. c_time:用户创建时间,auto_now_add=True 表示自动在模型创建时添加时间
6. small_description:用户的签名
7. big_detail:用户的个人介绍,用 TextField 而不是 CharField 是因为可能会出现 html 内容
后面要做的环节带来的信息
8. has_confirmed:用户是否经过邮箱认证,在后面的邮箱认证环节会用到
9. no_comment:用户是否被禁言,在后面的用户评论环节会用到
10. loved_blog:用户点赞了哪些博客,在后面的博客环节会用到
其他:
def __str__(self):Python 内置的魔法方法,用于在 admin 后台中显示看着方便
class Meta:定义模型的元数据
- ordering=['-c_time'] 表示按照用户创建时间逆序排序
- verbose_name 为模型定义了一个人类可理解的名称,在后台中显示看着方便
- verbose_name_plural 和 verbose_name 本质一样,是名称的复数形式
用户模型写好了,因为后面有邮箱验证及重置密码时验证的环节,需要验证码模型
同样还是在 models.py,写入如下代码:
- ConfirmString 表示邮箱验证时的验证码模型
- ResetString 表示修改密码时的验证码模型
class ConfirmString(models.Model):
code = models.CharField(max_length=256)
tag = models.CharField(max_length=256, default="")
user = models.OneToOneField('User', on_delete=models.CASCADE)
c_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.user.name + ": " + self.code
class Meta:
ordering = ["-c_time"]
verbose_name = "确认码"
verbose_name_plural = "确认码"
class ResetString(models.Model):
code = models.CharField(max_length=256)
user = models.OneToOneField('User', on_delete=models.CASCADE)
c_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.user.name + ":" + self.code
class Meta:
ordering = ["-c_time"]
verbose_name = "密码重置码"
verbose_name_plural = "密码重置码"
代码注释(由于两个模型大同小异,且与前面的模型有相似之处,只做部分解释):
1. code:验证码的内容
2. tag:相当于一个获取验证码的标签
3. user:外键,表示验证码的所有者(用户)
- on_delete=models.CASCADE 表示在关联的用户被删除以后,关联的验证码也跟着删除
注意:这里的验证码内容都是需要加密的,因此 max_length 要开的较大
4. 保存模型至数据库
将所有的模型代码写完后,保存文件
首先,进入 LZLBlog/LZLBlog/settings.py,找到 INSTALLED_APPS 列表,将 'login' 添加进去
然后打开 cmd,在与 manage.py 同目录下执行
python manage.py makemigrations
执行后会弹出提示如下 ——
在 cmd 中,继续执行
python manage.py migrate
执行后弹出提示如下,模型保存至数据库即完成
最后,可以在 LZLBlog/login/admin.py 中输入如下内容,注册模型至 Django 自带的后台
# from django.contrib import admin
from . import models
admin.site.register(models.User)
admin.site.register(models.ConfirmString)
admin.site.register(models.ResetString)
在 cmd 中输入指令,跟随提示,创建后台的超级管理员
python manage.py createsuperuser
最后运行指令,打开 Django 提供的开发服务器
python manage.py runserver
在浏览器中查看 http://127.0.0.1:8000/admin/ ,使用刚刚注册的超级管理员的用户名与密码登录,即可看到已创建的模型~
至此,今天的内容就完结啦~
下篇做登录视图与 URL~