文章目录
支持Markdown语法和代码高亮的个人博客系统
完整代码在:https://gitee.com/dadadaliuliuliiu/BlogProject
零、Django
面视问 :站点有没有做防护,遇到什么问题,怎么解决?
一、项目介绍
随着互联网的飞速发展,让Internet应用在全球范围内日趋普及,当今社会也正快速向信息化社会发展,开发个人博客有着非常重要的意义。
1.本文采用的技术
本系统采用 Django
技术,后台开发工具为Pycharm
,前台开发工具为Pycharm
,数据库采用 MySQL
来进行开发。
2.本文实现的功能
- 该文主要包含游客前台阅读、留言博文功能。后台用户登录、注册、管理个人博客, 精确地记录一篇文章的阅读量, 自动生成文章摘要等功能。
- 为了让博客文章具有良好的排版,显示更加丰富的格式,支Markdown 语法和代码高亮。 这种博客是一种可以快速发布并且及时更新信息的网站,用户可以简洁快速地完成博客的书写、公布和更新,很好实现用户体验,大大提高了用户的工作效率。
3.系统环境
- python3.7
- Django2.2
二、项目准备
1.建立 Django 工程
新建一个django项目自动生成的目录:
2.项目配置
设置中文和时区
浏览器端测试
3.创建admin后台管理的用户及测试
(base) F:\ziliao\python_kaifa\my_code\12_django项目\BlogProject>python manage.py createsuperuser #创建后台管理的用户
用户名 (leave blank to use 'daliu'): admin
电子邮件地址: admin@qq.com
Password:westos123
Password (again):
(base) F:\ziliao\python_kaifa\my_code\12_django项\BlogProject>python manage.py runserver
浏览器端测试:
登陆刚才创建的用户,进入后台管理:
admin
westos123
4.创建blog应用 及 注册应用
blog 是整个BlogProject项目的一个功能
(base) F:12_django项目\BlogProject>python manage.py startapp blog
目录中出现blog应用
在BlogProject里注册
以上是项目准备
三、项目
第一步 数据库模型的创建
1.数据库需求分析
博客最主要的功能就是展示我们写的文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库。我们把写好的文章永久地保存在数据库里,当用户访问我们的博客时,Django 就去数据库里把这些数据取出来展现给用户。
数据库存储的数据其实就是表格的形式。
存储博客文章的数据库表如下所示:
分析一下我们就会发现一个问题,这 3 篇文章的分类和标签都是相同的,这会产生很多重复数据,当数据量很大时就浪费了存储空间。
我们把分类和标签提取出来,做成单独的数据库表,再把文章和分类、标签关联起来。
下面分别是分类和标签的数据库表:
2.博客模型代码
#blog/models.py
from datetime import datetime
from django.db import models
# Create your models here.
class Category(models.Model):
"""分类表"""
#一个类就是一个数据库表
# Django的数据库模型默认会添加id作为主键
name=models.CharField(max_length=100)
def __str__(self):
return self.name
class Tag(models.Model):
"""标签表"""
name=models.CharField(max_length=100)
def __str__(self):
return self.name
class Post(models.Model):
""" 博客表 """
# 文章标题
title = models.CharField(max_length=70)
# 文章正文,我们使用了 TextField。
body = models.TextField()
# 这两个列分别表示文章的创建时间和最后一次修改时间,存储时间的字段用 DateTimeField 类型。
# auto_now=True,每次对像更新时更新时间。auto_now_add=True对象第一次创建时设置的时间
created_time = models.DateTimeField(auto_now_add=True)
modified_time = models.DateTimeField(auto_now=True)
# 文章摘要,可以没有文章摘要,但默认情况下 CharField 要求我们必须存入数据,否则就会报错。
# 指定 CharField 的 blank=True 参数值后就可以允许空值了。
excerpt = models.CharField(max_length=200, blank=True)
# on_delete=False在Django1.x版本默认是不级联删除的,可以不做设置. Django2.x一定要自 行指定.
category = models.ForeignKey(Category, on_delete=False)
# 多对多关系。 blank=True标签可以不做设置
tags = models.ManyToManyField(Tag, blank=True)
# 文章作者,这里 User 是从 django.contrib.auth.models 导入的。
# 因为我们规定一篇文章只能有一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关 系,和 Category 类似。
# author = models.ForeignKey(User)
def __str__(self):
return self.title
3.数据库迁移
数据库做了改变,就要写入数据库,所以要产生一个迁移文件
(base) F:12_django项目\BlogProject>python manage.py makemigrations #生成迁移脚本
Migrations for 'blog':
blog\migrations\0001_initial.py
- Create model Category
- Create model Tag
- Create model Post
(base) F:\12_django项目\BlogProject>python manage.py migrate # 将迁移信息写入数据库
Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
Applying blog.0001_initial... OK
第二步 Django Admin 后台发布文章
1.在 Admin 后台注册模型
要在后台注册我们自己创建的几个模型,这样 Django Admin 才能知道它们的存在,注册非常简单,只需要在 blog\admin.py 中加入下面的代码:
blog 是整个BlogProject项目的一个功能 ,Post, Category, Tag是一个类,他们分别对应一个数据库表,表示博文的正文、分类以及标签信息。因此,要在后台注册我们自己创建的几个模型,这样 Django Admin 才能知道它们的存在
# blog/admin.py
from django.contrib import admin
from blog.models import Post, Category, Tag
admin.site.register(Post)
admin.site.register(Category)
admin.site.register(Tag)
运行程序
访问网址 http://127.0.0.1:8000/admin/ 测试是否设置成功?
2.定制 Admin 后台
在 admin post 列表页面,我们只看到了文章的标题,但是我们希望它显示更加详细的信息,这需要我们来定制 Admin 了,在 admin.py 添加如下代码:
from django.contrib import admin
from blog.models import Post, Category, Tag
class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'created_time', 'modified_time', 'category']
list_display_links =