【Django】开发个人博客系统【1】

使用Django开发个人博客系统,博客系统包括用户(博主)注册和登录、博主资料信息、图片墙功能、留言板功能、文章列表、文章正文内容和Admin后台系统。

1. 项目架构设计

在这里插入图片描述

在这里插入图片描述
下一步将上述设置写入Django的配置文件settings.py,当Django运行的时候能自动加载相应的功能应用。
将项目应用account、album、article和interflow写入配置属性INSTALLED_APPS,并在配置属性MIDDLEWARE中添加中间件LocaleMiddleware,使Admin后台系统支持中文语言,配置代码如下:

# myblog的settings.py
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','article','album','account','interflow',
]
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware',# 添加中间件LocaleMiddleware'django.middleware.locale.LocaleMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

然后连接sql server数据库:
具体连接参考其他博客。

pip install mssql-django==1.2
pip install pyodbc django-pyodbc-azure

配置:

DATABASES = {'default': {'ENGINE': 'sql_server.pyodbc','NAME': 'blogdb',  # 数据库名称'HOST': '127.0.0.1',  # 数据库地址,本机 ip 地址 127.0.0.1'PORT': 1433,  # 端口'USER': 'bloger',  # 数据库用户名'PASSWORD': '123456',  # 数据库密码'OPTIONS': {'driver': 'ODBC Driver 17 for SQL Server',},}
}
pip install Pillow
# account的models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):name=models.CharField('姓名',max_length=50,default='匿名用户')introduce = models.TextField('简介', default='暂无介绍')company=models.CharField('公司',max_length=100,default='暂无信息')profession=models.CharField('职业',max_length=100,default='暂无信息')address=models.CharField('住址',max_length=100,default='暂无信息')telephone=models.CharField('电话',max_length=11,default='暂无信息')wx = models.CharField('微信', max_length=50, default='暂无信息')qq = models.CharField('QQ', max_length=50, default='暂无信息')wb = models.CharField('微博', max_length=100, default='暂无信息')photo=models.ImageField('头像',blank=True,upload_to='images/user/')# 设置返回值def __str__(self):return self.name

继续配置:

# 配置自定义用户模型MyUser
AUTH_USER_MODEL = 'account.MyUser'
STATICFILES_DIRS = [BASE_DIR / 'publicStatic']
# 设置媒体资源的保存路径
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

项目应用album使用模型AlbumInfo存储图片墙的图片信息,它设有外键字段关联模型MyUser,与模型MyUser组成一对多的数据关系,使每个用户(博主)的图片墙只能显示自己上传的图片信息。我们在项目应用album的models.py中定义模型AlbumInfo:

# album 的models.py
from django.db import models
from account.models import MyUserclass AlbumInfo(models.Model):id = models.AutoField(primary_key=True)user = models.ForeignKey(MyUser, on_delete=models.CASCADE,verbose_name='用户')title = models.CharField('标题',max_length=50,blank=True)introduce = models.CharField('描述',max_length=200,blank=True)photo = models.ImageField('图片',blank=True,upload_to='images/album/')def __str__(self):return str(self.id)class Meta:verbose_name = '图片墙管理'verbose_name_plural ='图片墙管理'

项目应用article实现用户(博主)的文章管理,每篇文章设有分类标签、正文内容和评论信息,三者分别对应模型ArticleTag、ArticleInfo和Comment,每个模型之间的数据关系说明如下:
(1)模型ArticleTag设有外键字段关联模型MyUser,与模型MyUser组成一对多的数据关系。
(2)模型ArticleInfo不仅与模型MyUser组成一对多的数据关系,并且与模型ArticleTag组成多对多的数据关系。
(3)模型Comment只对模型ArticleInfo组成一对多的数据关系。

# article 的models.pyfrom django.db import models
from django.utils import timezone
from account.models import MyUserclass ArticleTag(models.Model):id = models.AutoField(primary_key=True)tag = models.CharField('标签',max_length=500)user = models.ForeignKey(MyUser,on_delete=models.CASCADE,verbose_name='用户')def __str__(self):return self.tagclass Meta:verbose_name = '博文分类'verbose_name_plural ='博文分类'class ArticleInfo(models.Model):author = models.ForeignKey(MyUser,on_delete=models.CASCADE,verbose_name='用户')title = models.CharField('标题',max_length=200)content = models.TextField('内容')articlephoto = models.ImageField('文章图片',blank=True,upload_to='images/article/')reading =models.IntegerField('阅读量',default=0)liking = models.IntegerField('点赞量',default=0)created = models.DateTimeField('创建时间',default=timezone.now)updated = models.DateTimeField('更新时间',auto_now=True)article_tag = models.ManyToManyField(ArticleTag,blank=True,verbose_name='文章标签')def __str__(self):return self.titleclass Meta:verbose_name = '博文管理'verbose_name_plural = '博文管理'class Comment(models.Model):article = models.ForeignKey(ArticleInfo,on_delete=models.CASCADE,verbose_name='所属文章')commentor = models.CharField('评论用户',max_length=90)content = models.TextField('评论内容')created = models.DateTimeField('创建时间',auto_now_add=True)def __str__(self):return self.article.titleclass Meta:verbose_name = '评论管理'verbose_name_plural = '评论管理'

项目应用interflow使用模型Board存储留言板信息,它与模型MyUser组成一对多的数据关系,从而区分每个用户(博主)的留言板信息。在项目应用interflow的models.py中定义模型Board,定义过程如下:

# interflow的 models.pyfrom django.db import models
from django.utils import timezone
from account.models import MyUserclass Board(models.Model):id = models.AutoField(primary_key=True)name = models.CharField('留言用户',max_length=50)email = models.CharField('邮箱地址',max_length=50)content = models.CharField('留言内容',max_length=500)created = models.DateTimeField('创建时间',default=timezone.now)user = models.ForeignKey(MyUser,on_delete=models.CASCADE,verbose_name='用户')def __str__(self):return self.emailclass Meta:verbose_name = '博客留言'verbose_name_plural = '博客留言'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/842805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【区分vue2和vue3下的elementUI和elementUI Plus的container组件,介绍如何安装,属性,事件,方法等以及使用案例】

vue2下的Element UI与vue3下的Element Plus的container组件区分 一、Element UI (vue2) 1. 安装 使用npm进行安装&#xff1a; npm install element-ui --save2. Container组件介绍 Container组件用于布局的容器组件&#xff0c;方便快速搭建页面的基本结构。它包含了<…

R可视化:另类的柱状图

介绍 方格状态的柱状图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…

【代码随想录——回溯算法——三周目】

1. 子集2 这题需要先进行排序&#xff0c;和候选人那题类似。防止出现重复的子集。 func subsetsWithDup(nums []int) [][]int {path : make([]int, 0)res : make([][]int, 0)sort.Ints(nums)var dfs func(nums []int, start int)dfs func(nums []int, start int) {res app…

保留两位小数不四舍五入,10000.55变成10000.54的坑

正解 function moneyFormat(num){ let money num "";//隐式转换为字符串和toString()效果一样//没有小数补齐这个0if(money.indexOf(".")"-1"){moneymoney".00";}else{//有小数截取前二位小数moneymoney.substring(0,money.inde…

多线程基本常识

多线程的状态 在Java中&#xff0c;一个线程的生命周期有以下几种状态&#xff1a; 新建&#xff08;New&#xff09;&#xff1a;当线程对象被创建时&#xff0c;线程处于新建状态。此时线程对象存在&#xff0c;但还没有调用start()方法启动线程。 运行&#xff08;Runnable…

逆向基础:软件手动脱壳技术入门

这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文&#xff0c;希望能给新学软件逆向和脱壳的童鞋们一点帮助。 1 一些概念 1.1 加壳 加壳的全称应该是可执行程序资源压缩&#xff0c;是保护文件的常用手段。加壳过的程序可以直接运行&#xff0c;但是不能查看源代码…

基于多源数据的微服务系统失败测试用例诊断

简介 本文介绍由南开大学、华为云及清华大学共同合作的论文:基于多源数据的微服务系统失败测试用例诊断。该论文已被FSE 2024&#xff08;The ACM International Conference on the Foundations of Software Engineering&#xff09; 会议录用&#xff0c;论文标题为: Fault D…

【MySQL】库的操作+表的操作

库的操作表的操作 1.库的操作1.1创建数据库1.2删除数据库1.3查找数据库1.4修改数据库1.5数据库备份和恢复1.6查看连接情况 2.库的操作2.1创建表2.2查看表结构2.3修改表2.4删除表 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; …

[数据集][目标检测]红外车辆检测数据集VOC+YOLO格式13979张类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;13979 标注数量(xml文件个数)&#xff1a;13979 标注数量(txt文件个数)&#xff1a;13979 标…

网络流量探针与流量分析系统:全面指南

目录 什么是网络流量探针&#xff1f; 流量分析系统的功能与重要性 流量分析系统的主要功能 流量分析系统的重要性 AnaTraf 网络流量分析仪 如何选择合适的网络流量探针与流量分析系统&#xff1f; 1. 性能与扩展性 2. 易用性与部署 3. 数据可视化与报告 4. 安全性与…

模拟退火算法教程(个人总结)

模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种基于概率的全局优化算法&#xff0c;广泛应用于解决复杂的优化问题。该算法借鉴了物理学中金属退火过程的原理&#xff0c;旨在通过模拟这一过程来寻找全局最优解。本文将详细介绍模拟退火算法的背景、基本原…

Java如何将tif格式图片转为jpg格式图片

在Java中&#xff0c;将TIFF&#xff08;.tif&#xff09;格式的图片转换为JPEG&#xff08;.jpg&#xff09;格式的图片&#xff0c;通常需要使用图像处理库&#xff0c;如Apache Commons Imaging&#xff08;之前称为Sanselan&#xff09;或Java Advanced Imaging (JAI)。但是…

LayaAir3.2来了:性能大幅提升、一键发布安装包、支持WebGPU、3D导航寻路、升级为真正的全平台引擎...

LayaAir3的每一个分支版本都是一次较大的提升&#xff0c;在3.1彻底完善了引擎生态结构之后&#xff0c;本次的3.2会重点完善全平台发布相关的种种能力&#xff0c;例如&#xff0c;除原有的安卓与iOS系统外&#xff0c;还支持Windows系统、Linux系统、鸿蒙Next系统&#xff0c…

暑期社会实践即将强势来袭,投稿三下乡文章最强攻略

以热爱充实自我 以笃行丰盈青春 这个盛夏“乡”约 纷纷迈出了社会实践的有力步伐 在展开社会实践的同时 也不要忘记投稿宣传的重要性哦 快快收藏住这份投稿攻略 助力团队展现更多精彩的实践故事! No.1 感悟思想伟力&#xff0c;守好“红色根脉” No.2 循迹“八八战略…

STM32 定时器问题

stm32通用定时器中断问题 STM32 定时器有时一开启就进中断的问题 ///

ModuleNotFoundError: No module named ‘pdfkit‘

ModuleNotFoundError: No module named pdfkit 这个错误表明你的 Python 环境中没有安装名为 pdfkit 的模块。pdfkit 是一个将 HTML 转换为 PDF 的工具&#xff0c;它依赖于 wkhtmltopdf 这个命令行工具。 为了解决这个问题&#xff0c;你需要安装 pdfkit 模块以及 wkhtmltopd…

2023山东ICPC省赛Problem E. Math Problem

2023 山东 I C P C 省赛 P r o b l e m E . M a t h P r o b l e m \Huge{2023山东ICPC省赛Problem E. Math Problem} 2023山东ICPC省赛ProblemE.MathProblem 文章目录 题意思路标程 比赛链接&#xff1a;Dashboard - The 13th Shandong ICPC Provincial Collegiate Programmin…

二叉树顺序结构的实现(堆)

二叉树的基本概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根结…

How to record real IP of user on nginx?

应用(Docker)使用WAF接入internet&#xff0c;nginx log 查不到用户的真实IP地址&#xff0c;于是修改nginx 设置&#xff0c;以下都是在linux下操作&#xff1a; 由于没有WAF权限&#xff0c;所以在 docker上启动了两个container&#xff0c;一个模拟WAF(r-proxy)&#xff0c…

软考 系统架构设计师系列知识点之SOME/IP与DDS(2)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之SOME/IP与DDS&#xff08;1&#xff09; 本文内容参考&#xff1a; 车载以太网 - SOME/IP简介_someip-CSDN博客 https://zhuanlan.zhihu.com/p/369422441 什么是SOME/IP?_someip-CSDN博客 SOME/IP 详解系列&#…