一、项目介绍
使用Django框架开发个人博客系统,博客系统包括用户注册登录、用户资料展示、图片墙功能、留言板功能、文章列表以及博文管理功能。
待完善:修改密码、搜索博文
二、项目设计
博客管理划分为3个数据表,分别是博文分类、博文管理、评论管理。博文分类设置文章的分类标签;博文管理提供博主对每篇文章进行修改、编辑操作;评论管理存储每篇文章的评论内容。
图片墙管理供博主管理自己上传的图片,可对每张图片进行修改、删除操作。
用户管理只能看到自己的账号信息,用户的账号信息可显示在博主的资料信息页。
留言管理功能只能看到访客给自己的留言内容,并且具有所有操作权限。
在设计系统架构时,必须围绕项目的核心功能进行设计,以核心功能为主题,向外延伸和完善其他功能,这是项目架构设计的思路之一。
一、添加项目应用
在Terminal中新建四个应用:account、album、article、interflow
python manage.py startapp account
python manage.py startapp album
python manage.py startapp article
python manage.py startapp interflow
另外还需在每个应用中添加urls.py文件
二、添加资源文件夹
在项目根目录中添加media、publicStatic、templates(已拥有就不用添加)
三、相关说明
1、项目应用account
用于实现用户注册、登录和用户资料信息页,自定义模型MyUser继承内置模型User,在内置模型User的基础上添加新字段,可以完善用户信息。模型MyUser为博主资料信息页提供数据支持,而且MyUser还需要关联其他模型。
2、项目应用album
用于实现图片墙功能,每个用户的图片墙只能显示自己上传的图片信息。模型AlbumInfo用于存储图片墙的图片信息,它设有外键字段关联模型MyUser,与模型MyUser组成一对多的数据关系。
3、项目应用article
用于实现用户的文章管理,每篇文章设有分类标签、正文内容和评论信息,三者分别对应模型ArticleTag、ArticleInfo、Comment,每个模型之间的数据关系说明如下:
- 模型ArticleTag设有外键字段关联模型MyUser,与模型MyUser组成一对多的数据关系。
- 模型ArticleInfo不仅与模型MyUser组成一对多的数据关系,并且与模型ArticleTag组成多对多的数据关系。
- 模型Comment只对模型ArticleInfo组成一对多的数据关系。
4、项目应用interflow
用于实现留言板功能,模型Board存储留言板信息,它设有外键字段关联模型MyUser,与模型MyUser组成一对多的数据关系,从而区分每个用户的留言板内容。
5、媒体资源文件夹media
用于存放用户上传的文章图片、图片墙图片、用户头像等资源文件,这类资源变动评率较高,因此与静态资源区分不同的存储路径。
6、静态资源文件夹publicStatic
用于存放网页的CSS样式文件、JavaScript脚本文件和网页图片等静态资源。
7、模板文件夹templates
用于存放模板文件,本项目以供使用7个模板文件,每个模板文件的说明如下:
- base.html定义项目的共用模板文件
- album.html实现图片墙的网页内容
- article.html实现文章列表页
- board.html实现留言板的网页内容
- detail.html实现文章正文内容页
- user.html实现用户注册和登录页
- about.html实现用户资料信息页
四、补充说明
项目需要注册登录功能,而Admin后台系统内置用户登录页面,为避免一个网页设有两个不同登录页面,对用户造成不好的体验。因此,我们将用户注册和登录页面作为Admin后台系统的登录页面。
在项目次级目录MyBlog中添加myadmin.py和myapps.py文件,这两个文件用于自定义Admin后台系统。
三、具体实现
一、环境配置
一、在settings.py 中进行相应的环境配置:
1、将项目应用写入配置属性INSTALLED_APPS:
1 | 复制INSTALLED_APPS = [ |
2、添加中间件使得系统支持中文
1 | 复制MIDDLEWARE = [ |
3、在TEMPLATES中配置模板文件夹
1 | 复制TEMPLATES = [ |
4、在DATABASES中配置数据库MySQL
1 | 复制DATABASES = { |
5、配置静态资源文件夹和媒体资源文件夹
1 | 复制# 配置自定义用户模型MyUser |
二、在各应用中的models.py配置数据模型
1、account的models.py
1 | 复制# 模型MyUser继承内置模型User,这里继承AbstractUser(该类为User的父类) |
2、album的model.py
1 | 复制# AlbumInfo设置外键关联模型MyUser |
3、article的model.py
1 | 复制from django.db import models |
4、interflow的model.py
1 | 复制# 模型Board设有外键字段关联模型MyUser,一对多关系。 |
三、创建数据库并进行数据迁移
可通过可视化连接工具Navicat创建blogdb数据库,字符集选择utf8mb4,创建好便可进行数据迁移:
1 | 复制一般在创建好表单类后需要进行数据迁移,在Pycharm的Terminal窗口下: |
四、定义路由(路由空间)列表
1 | 复制# MyBlog下的urls.py |
五、编写共用模板
共用模板又称基类模板base.html:
1 | 复制<html> |
页面样式和功能需在css及js中进行迭代优化,待提升!!!
二、编写功能模块
一、注册与登录
模型MyUser是内置模型User的扩展模型,用于保护用户信息,这里我们使用Django的Auth认证系统完成MyUser的用户登录与注册。
1、account的urls.py
定义登录与注册的路由信息
1 | 复制#!/usr/bin/env python |
2、account的views.py
1 | 复制from django.shortcuts import render, redirect |
3、前端页面user.html
1 | 复制<!DOCTYPE html> |
二、博主资料信息
博主资料信息使用模板文件about.html生成页面内容,用户信息来自模型MyUser,在项目应用account中实现博主资料信息网页功能。
1、account的urls.py
1 | 复制# 只需添加“关于我”的路由信息 |
2、account的views.py
1 | 复制# 只需在引入两个表的模块,并添加about视图 |
3、前端页面about.html
1 | 复制{% extends "base.html" %} <!--继承模板文件base.html--> |
三、图片墙功能
图片墙功能将用户上传的图片显示在网页上,图片以分页方式显示,每一页分为两列,每列显示四张图片。
1、album的urls.py
1 | 复制# 在album中定义路由信息 |
2、album的views.py
1 | 复制from django.shortcuts import render |
3、前端页面album.html
1 | 复制{% extends "base.html" %} |
四、留言板功能
留言板功能在项目应用interflow中实现,功能包括:留言信息展示和留言提交。
1、interflow的urls.py
1 | 复制#!/usr/bin/env python |
2、interflow的views.py
1 | 复制from django.shortcuts import render,redirect |
3、前端页面board.html
1 | 复制{% extends 'base.html' %} |
五、文章列表功能
该功能是将当前用户的所有文章进行分页显示。我在项目应用article中实现该功能的开发。
1、article的urls.py
1 | 复制#!/usr/bin/env python |
2、article的views.py
1 | 复制from django.shortcuts import render, redirect |
3、前端页面article.html
1 | 复制{% extends "base.html" %} |
六、文章正文内容
文章正文内容显示文章标题、阅读量、发布时间、作者、文章内容和评论内容。我在项目应用article中实现该功能的开发。
1、article的urls.py
1 | 复制# 只需添加对应正文内容的路由信息 |
2、article的views.py
1 | 复制# 只需添加对用的视图函数,以及导入相应的模块 |
3、前端页面detail.html
1 | 复制{% extends "base.html" %} |
七、Admin后台系统
项目模型存储了所有用户的数据信息,但每个用户登录Admin后台系统只能管理自己的数据信息,因此每个模型的ModelAdmin必须重写方法formfield_for_foreignkey()和get_queryset()。
1、account的admin.py
1 | 复制from django.contrib import admin |
2、album的admin.py
1 | 复制from django.contrib import admin |
3、article的admin.py
1 | 复制from django.contrib import admin |
4、interflow的admin.py
1 | 复制from django.contrib import admin |
5、account的__init__.py
1 | 复制from django.apps import AppConfig |
6、album的__init__.py
1 | 复制from django.apps import AppConfig |
7、article的__init__.py
1 | 复制from django.apps import AppConfig |
8、interflow的__init__.py
1 | 复制from django.apps import AppConfig |
八、自定义Admin登录页
Django内置Admin后台系统已有用户登录页面。这样与我写的登录功能冲突,所以我将Admin后台系统的登录页面改为项目应用account实现的登录页面.
1、MyBlog的myadmin.py
1 | 复制# 重写父类admin_view()和get_urls()方法,只需改动两处!!!已在代码中注释 |
2、MyBlog的myapps.py
1 | 复制#!/usr/bin/env python |
3、MyBlog的settings.py
1 | 复制INSTALLED_APPS = [ |
三、Django CKEditor
模型字段content只负责存储文章内容,它不会对文章内容进行排版布局,如果要编写排版整齐、布局精美的博客文章,就需要引进Django的第三方功能应用Django CKEditor生成文章编辑器。
一、安装
1 | 复制# 在命令行中输入安装指令 |
二、MyBlog的setting.py
1 | 复制INSTALLED_APPS = [ |
三、相应文件的更改
1、MyBlog的urls.py
1 | 复制from django.contrib import admin |
2、article的models.py
1 | 复制# 此处只需导入字段类型,更改content字段类型即可 |
四、数据迁移
由于变更了文章内容的数据类型,所以现在需要进行数据迁移。
1 | 复制# 在cmd或Terminal中执行以下命令 |
四、后期迭代
待完善功能:用户查找,博文搜索、用户管理改为账户管理