【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 MyUser

class 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.py

from django.db import models
from django.utils import timezone
from account.models import MyUser

class 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.tag
    class 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.title
    class 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.title
    class Meta:
        verbose_name = '评论管理'
        verbose_name_plural = '评论管理'

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

# interflow的 models.py

from django.db import models
from django.utils import timezone
from account.models import MyUser

class 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.email
    class Meta:
        verbose_name = '博客留言'
        verbose_name_plural = '博客留言'
        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言编程】Codeblocks安装步骤

操作系统 Windows 11 操作系统 安装步骤 1、 访问Codeblocks官网:Codeblocks官网,点击Download下载: 下载好的安装包: 2、 右键——以管理员身份运行: 3、 点击Next下一步: 4、 点击I Agree同意用…

解锁数据关联之道:SQL 表连接详解

文章目录 概述表关系横向连接内连接 inner join左连接 left join右连接 right join全连接 full join交叉连接 cross join 纵向合并UNION ALLUNION 概述 在数据处理、数据分析中常会用到表连接。表连接的作用是将多个表中的数据关联起来,以便在查询过程中获取更全面…

【LabVIEW FPGA入门】使用事件发生函数同步FPGA循环

1.使用事件发生函数 使用 Occurrences 函数来控制单独的同步活动。特别是,当您希望程序框图的一部分等待程序框图的另一部分完成任务而不强制 LabVIEW 进行轮询时,请使用这些函数。 您可以使用全局变量执行类似于occurrences函数的功能,通过一…

通过Windows事件日志介绍APT-Hunter

APT-Hunter是用于Windows事件日志的威胁搜寻工具,该工具能够检测隐藏在Windows事件日志中的APT运动,如果您是弄威胁情报的人,那么我保证您会喜欢使用此工具的,为什么?我将在本文中讨论原因,请注意&#xff…

音视频开发9 FFmpeg 解复用框架说明,重要API说明

一,播放器框架 二 常用音视频术语 容器/文件(Conainer/File): 即特定格式的多媒体文件, 比如mp4、flv、mkv等。 媒体流(Stream): 表示时间轴上的一段连续数据&#xff0…

数据整理的Compact流程 (二)|OceanBase数据转储合并技术解读(二)

上篇文章《数据整理的Compact流程 (一)|OceanBase数据转储合并技术解读(二)》中,有讲解到,在OceanBase数据库中,当MemTable写满时,将其下刷到Mini SSTable的过程包含两个…

「小明赠书活动」第四期《Java开发坑点解析:从根因分析到最佳实践》

目录 ⭐️ 赠书 - 《Java开发坑点解析:从根因分析到最佳实践》 参 加 活 动 方 式 见 文 末 ⭐️内容简介 -《Java开发坑点解析:从根因分析到最佳实践》 ⭐️阅读建议 -《Java开发坑点解析:从根因分析到最佳实践》 ⭐️《Java开发坑…

CSS 介绍及用法,常用属性

一、CSS介绍 A. 简介 CSS全称:全称为层叠样式表(Cascading Style Sheets),是一种用于描述网页外观和格式的计算机语言。CSS可以使网页的布局更加丰富和多样化,并且可以将样式信息与网页内容分离,使得网…

C语言——基于stm32G030的温湿度传感器项目实验

一、功能要求: 设备自检功能: 设备上电自检(检查传感器采集是否正常, DHT11有存在响应, 可以自检使用, )自检通过后,由串口打印设备状态信息。 自动控制功能: 进入自动控…

python连接FTP服务器:[WinError 10054] 远程主机强迫关闭了一个现有连接

一、原始报错信息 pythonProcess finished with exit code -1073740791 (0xC0000409) 这个报错信息,太过于笼统,是分析不出代码出了什么问题的。 二、打印详细报错信息 在服务器相关可能报错的地方,进行报错信息追踪: import …

如何在OrangePi AIpro智能小车上实现安全强化学习算法

随着人工智能和智能移动机器人的广泛应用,智能机器人的安全性和高效性问题受到了广泛关注。在实际应用中,智能小车需要在复杂的环境中自主导航和决策,这对算法的安全性和可靠性提出了很高的要求。传统的强化学习算法在处理安全约束时存在一定…

SpringBoot搭建OAuth2

背景 前几天自己从零开始的搭建了CAS 服务器,结果差强人意(反正是成功了)。这几天,我躁动的心又开始压抑不住了,没错,我盯上OAuth2了,大佬们都说OAuth2比CAS牛批,我就想知道它有多牛…

Elasticsearch不删原有jdk8导致的系列安装和启动问题

以前在空机器直接装elasticsearch,没有遇到什么问题。今天在现有JDK上安装,遇到的问题记录一下: 1. JDK的环境变量配置与我原有的不一致报如下错误: [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

SSL函数01-数组函数Array Functions

一、数组的初始化 SSL中,数组下标从1开始! 1-1、不知道数组的长度 :DECLARE a6; a6 : {}; Aadd(a6,a); Aadd(a6,b); Aadd(a6,c); 当用a : {}创建一个数组的时候,不可以用a[1] 值,来赋值! 1-2、知道数组的长度 方式一…

【录用案例】2天录用!提交可录,沾边即可!

本周投稿推荐 SSCI • 2区社科类,3.0-4.0(录用友好) EI • 计算机工程生物医学等(2天录用) CNKI • 3天内初审录用,随即出版(急录友好) SCI&EI • 4区生物医学类&#x…

数据链路层 + NAT技术

数据链路层:负责设备之间的数据帧的传送和识别。 一、以太网 以太网的帧格式 如何分离报头和有效数据? 报头是固定长度的 如何将数据交给上层协议? 通过类型,如果是0800,则交给IP协议,如果是0806&#xf…

JavaScript正则表达式

一、介绍 正则表达式是用于匹配字符串中字符组合的模式。在javascript中,正则表达式也是对象。通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式。 正则表达式的作用: 表单验证(匹配)、过滤敏感…

筛斗数据提取:解锁信息宝藏的关键步骤

在数字化时代,数据已成为推动社会进步和企业发展的关键要素。然而,数据本身并不直接产生价值,其价值在于我们如何从中提取有用的信息。数据提取,作为解锁信息宝藏的关键步骤,对于任何希望从海量数据中获取洞察力和竞争…

十四天学会Vue——Vue核心(理论+实战)上篇(第一天)

一、Vue核心(上篇) 热身tops:选取开发模式 ①用于开发模式 我们只需要知道 我们是开发模式,开发模式他会跟你提示代码出现错误的地方以及出错原因,而生产模式比较简洁。 ②用于生产模式 1.1 new Vue()实例 了解Vue&a…

人脸识别——筛选与删除重复或近似重复数据提高人脸识别的精确度

1. 概述 人脸识别研究通常使用从网上收集的人脸图像数据集,但这些数据集可能包含重复的人脸图像。为了解决这个问题,我们需要一种方法来检测人脸图像数据集中的重复图像,并提高其质量。本文介绍了一种检测人脸图像数据集中重复图像的方法。该…