写在前面:无论遇到什么困难,都要微笑面对呀!!!加油加油
以此来记录个人博客开发历程
1.前端页面选择
为自己的博客选择好看的前端页面,因为我是自学Python + Django后端开发,不了解前端内容,所以直接在模板网站下载好看的界面来修改即可。我选择的是17素材上的前端页面,选择完成下载即可。(有的是需要VIP和金币的,就只能八仙过海,各显神通了;我这边有十个前端模板,若同学需要可以私信或者留言)
2.博客功能构思
在写代码之前,需要对要实现的博客功能和界面做一个简要规划,磨刀不误砍柴工嘛。
我希望实现的功能
- 博客展示 首页:展示博客标题、摘要、作者等简要信息,点击可以进入博客详细页;博客详细页:展示完整的博客内容,同时在博客下方有评论内容,需要登录才可以添加评论,否则只能查看评论;可以根据发布日期、博客分类、博客标签进入该类的博客展示页。
- 用户主页 用户登录后可以进入个人主页,可以展示个人评论和个人博客;同时可以添加新博客。
- (不会很全,只是大概罗列了一个方向)
业务逻辑分析
- 博客表:标题、作者、摘要、发布日期、分类、标签、阅读量、评论、内容
- 用户表:登录用户名、登录密码、暱称、评论、发布博客
- 评论表:内容、发布用户、发布博客、发布时间等
- 博客分类表:分类名
- 博客标签表:标签名
- 备注:在进行业务逻辑分析的过程中,有许多不完善的地方,需要结合开源项目来完善
基于以上,可以看出博客、用户是比较独立的功能,所以可以单独建立apps。此外,我参照开源项目将评论也单独作为一个apps。
接下来,准备开发model层
3. Model层开发(上)
本项目使用PyCharm-2019.3开发
- 新建Django项目
- 在终端使用命令创建用户(user)、博客(blog)、评论(comments)三个子应用
django-admin startapp user
django-admin startapp comments
django-admin startapp blog
每条执行完之后回车
执行完之后目录结构如图。
- 在settings.py中添加apps,修改数据库、语言类型和时区
- 使用PyCharm连接数据库,在General 中输入登录用户名和密码,在Advanced中修改serverTimezone 为 Asia/Shanghai(这是因为在创建数据库或表的时候,MySQL可能会报时区错误异常,在这里设置以解决该问题)
- 在settings.py中数据库配置中 ’NAME‘ 对应的数据库名为Blog(个人创建,可根据需要自行设置),在MySQL中创建数据库(MySQL大小写不敏感,所以数据库名可以直接用 blog 就好,这样在后面看起来舒服一点,图就不改了…汗)
- 博客表结构的创建
- 博客表
列名 | 字段名 | 字段类型 |
---|---|---|
主键 | id | AutoField |
博客标题 | blogTitle | CharField |
博客作者 | blogAuthor | ForeignKey |
博客摘要 | abstract | CharField |
发布日期 | createDatetime | DateTimeField |
种类 | category | ForeignKey |
标签 | tags | ManyToManyField |
博客正文 | text | TextField |
浏览量 | viewsCount | PositiveIntegerField |
评论数 | commentsCount | PositiveIntegerField |
外键约束说明:博客表中的作者、种类、标签分别与用户表、种类表、标签表相关联。一个作者对应多个博客、一个博客只有一个作者(一对多,ForeignKey);一个博客只有一个种类,一个分类下有多篇博客(一对多,ForeignKey);一篇博客有多个标签,一个标签下有多篇博客(多对多,ManyToManyField)。删除博客,种类、作者不会受影响,删除作者或种类,该分类下的所有博客被删除,级联操作(在一对多的关系中),所以在外键约束中加入 on_delete = models.CASADE;
- 博客种类表
列名 | 字段名 | 字段类型 |
---|---|---|
主键 | id | AutoField |
博客种类 | name | CharField |
- 博客标签表
列名 | 字段名 | 字段类型 |
---|---|---|
主键 | id | AutoField |
标签名 | name | CharField |
补充:还需要增加一些关键字来约束这些字段,如:blank = True / False : 在Django后台管理中新增一条内容时该字段是否可以为空;default = 设置默认值 ; unique = True / False 能否重复;primary_key = 是否是主键等。常用字段约束在本篇博客末尾附表…
对博客表结构在前期按照以上表结构创建,在blog/model.py中写入模型类代码
from django.db import models
from user.models import User
# 引入timezone用于记录博客创建时间
from django.utils import timezone
# Create your models here.
class Category(models.Model):
id = models.AutoField(verbose_name='主键', primary_key=True)
name = models.CharField(verbose_name='种类名', max_length=100, unique=True)
class Tag(models.Model):
id = models.AutoField(verbose_name='主键', primary_key=True)
name = models.CharField(verbose_name='标签名', max_length=100, unique=True)
class Blog(models.Model):
id = models.AutoField(verbose_name='主键', primary_key=True)
blogTitle = models.CharField(verbose_name='文章标题', max_length=70, unique=True)
abstract = models.CharField(verbose_name='摘要', max_length=200, blank=True)
createDatetime = models.DateTimeField(verbose_name='创建时间', blank=True, default=timezone.now)
viewsCount = models.PositiveIntegerField(verbose_name='浏览量', blank=True, default=0)
commentsCount = models.PositiveIntegerField(verbose_name='评论数', blank=True, default=0)
text = models.TextField(verbose_name='博客正文')
blogAuthor = models.ForeignKey(to=User, on_delete=models.CASCADE, verbose_name='作者')
category = models.ForeignKey(to=Category, on_delete=models.CASCADE, verbose_name='分类')
tags = models.ManyToManyField(to=Tag, verbose_name='标签')
还需要先在user/models.py 下新建一个User类,用pass占位。
补充:
常用字段约束
字段约束 | 含义 | 默认值 |
---|---|---|
primary_key | 是否是主键 | False(不是主键) |
null | 能否为空 | False(不能为空) |
unique | 能否重复 | False(可以重复) |
default | 默认值 | False |
blank | 在Django后台中能否为空 | False(不能为空) |