Task3 Django搭建个人博客网站

news/2024/5/13 21:53:51/文章来源:https://blog.csdn.net/qq_44285092/article/details/118257780

一、个人博客网站模块划分

常见的博客网站的模块有:首页、文章摘要,导航、点击加载更多、分页、友情链接、推荐文章、文章的点赞、收藏、分享、评论等等。我们可以根据自己的需求来定制一些功能,实现其中的一部分功能来开发个人博客。

具体的模块划分思维导图

此思维导图用processon所绘制,喜欢的小伙伴可微信扫码注册登录,然后就可以免费使用啦,免费的基本上足够使用了。可下载图片、加载和保存为xmind文件等

个人博客实体关系图(自带的mermaid绘制)

Post+int ID+string title+string description+string content+int status+datetime created_time-Category category-Tag tag-Comment comments-User ownerCategory+int ID+string title+int status+datetime created_time+int navigation-User ownerTag+int ID+string title+int status+datetime created_time-User ownerLink+int ID+string title+string net_link+datetime created_time+int weight-User ownerComment+int ID+datetime created_time-Post title-User owner-User eMail-Link net_link-Post descriptionSideBar+int ID+string title+string type+datetime created_time-User ownerUser+int ID+string achievement+img avatar

博客功能需求划分

二、apps models.py 的编写

根据实体关系图和业务逻辑分析,来创建出三个应用:blog(博客部分),blog_config(博客设置部分)和comments(评论部分)

2.1 apps的创建和注册

# 创建app
python manage.py startapp blog
python manage.py startapp blog_config
python manage.py startapp comments
# 注册应用
# Application definition
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','blog','blog_config','comments',
]

2.2 相关apps 编写

2.2.1 blog应用编写

blog ==> models.py:编写数据表

from django.db import models
from django.contrib.auth.models import User
# Create your models here.class Category(models.Model):"""分类"""# 自定义选择项,因为是固定好的,因此定义为元组,里面也是元组STATUS_ITEMS = ((1, "正常"),(0, "删除"),)# ID:Django可以自动创建# id = models.AutoField(primary_key=True)# name:名称,一般不需要写太长name = models.CharField(max_length=50, verbose_name="名称")# status:状态,是一个自定义选择项choices,需要提前设置好;不需要每次都进行选择,因此设置一个默认值1为有效status = models.IntegerField(choices=STATUS_ITEMS, default=1, verbose_name="状态")# owner:作者,使用的是网站创建的超级管理员,应该是一个外键,与网站的User用户相关联,因此需要导入网站的User# on_delete=models.CASCADE,级联删除,删除时对应的User所有也被删除owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")# is_nav:是否设置导航栏,因为不需要每次新增一个都设置导航,因此默认设置为 Falseis_nav = models.BooleanField(default=False, verbose_name="是否为导航")# created_time:创建时间,以当前时间为准created_time = models.DateTimeField(auto_now=True, verbose_name="创建时间")def __str__(self):# 设置一个返回值,目的是方便创建后台时返回一个值,便于判断return self.nameclass Meta:verbose_name = '分类'verbose_name_plural = '分类'class Tag(models.Model):"""标签"""# 自定义选择项,因为是固定好的,因此定义为元组,里面也是元组STATUS_ITEMS = ((1, "正常"),(0, "删除"),)# ID,Django可以默认创建# name:名称name = models.CharField(max_length=50, verbose_name="名称")# status:状态status = models.IntegerField(choices=STATUS_ITEMS, default=1, verbose_name="状态")# owner:作者owner = models.ForeignKey(User, verbose_name="作者", on_delete=models.CASCADE)# created_time:创建时间created_time = models.DateTimeField(auto_now=True, verbose_name="创建时间")def __str__(self):return self.nameclass Meta:verbose_name = verbose_name_plural = '标签'class Post(models.Model):"""文章"""#     ID# 标题:titletitle = models.CharField(max_length=350, verbose_name="标题")# 作者:ownerowner = models.ForeignKey(User, verbose_name="作者", on_delete=models.CASCADE)# 分类(多对一):categorycategory = models.ForeignKey(Category, verbose_name="分类", on_delete=models.CASCADE)# 标签(多对多):tagstag = models.ManyToManyField(Tag, verbose_name="标签")# 摘要:descriptiondescription = models.CharField(max_length=1024, verbose_name="摘要")# 正文:contentcontent = models.TextField(verbose_name="正文")# 状态(草稿,发布,删除):status# 自定义选择项,因为是固定好的,因此定义为元组,里面也是元组STATUS_ITEMS = ((1, "正常"),(0, "删除"),(2, "草稿"),)status = models.IntegerField(choices=STATUS_ITEMS, default=2, verbose_name="状态")# 发布时间:created_timecreated_time = models.DateTimeField(auto_now=True, verbose_name="创建时间")def __str__(self):return self.titleclass Meta:verbose_name = verbose_name_plural = '文章'

blog ==> admin.py:编写后台管理

  • ① 先不写,后面根据需求编写
from django.contrib import admin
from .models import Category, Tag, Post
# Register your models here.@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):# list_display = ("title", "create_time", "count")pass@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):# list_display = ("title", "create_time", "count")pass@admin.register(Post)
class PostAdmin(admin.ModelAdmin):# list_display = ("title", "create_time", "count")pass
  • ② 待写,第三节

2.2.2 blog_config应用编写

blog_config ==> models.py:编写数据表

from django.db import models
from django.contrib.auth.models import User
# Create your models here.class Link(models.Model):"""友情链接"""#     ID# 网站名称:titletitle = models.CharField(max_length=50,verbose_name="网站名称")# 链接:hrefhref = models.URLField(verbose_name="链接")# 作者:ownerowner = models.ForeignKey(User, verbose_name="作者", on_delete=models.CASCADE)# 状态:statusSTARUS_ITEMS = ((1, "正常"),(0, "删除"),)status = models.IntegerField(choices=STARUS_ITEMS,default=1,verbose_name="状态")# 创建时间:created_timecreated_time = models.DateTimeField(verbose_name="创建时间",auto_now=True)# 权重:weightweight = models.IntegerField(choices=zip(range(1,11),range(1,11)),default=1,verbose_name="权重")def __str__(self):return self.titleclass Meta:verbose_name = verbose_name_plural = '友情链接'class SideBar(models.Model):"""侧边栏"""# ID# 标题:titletitle = models.CharField(max_length=50,verbose_name="标题")# 展示类型:display_type    # 最新文章 最热文章 最近评论TYPE_ITEMS = ((1, "HTML"),(2, "最新文章"),(3, "最热文章"),(4, "最近评论"),)display_type = models.IntegerField(choices=TYPE_ITEMS,default=1,verbose_name="展示类型")# 状态:statusSTARUS_ITEMS = ((1, "展示"),(0, "隐藏"),)status = models.IntegerField(choices=STARUS_ITEMS,default=1,verbose_name="状态")# 内容:contentcontent = models.CharField(max_length=500,verbose_name="内容")# 创建时间:created_timecreated_time = models.DateTimeField(verbose_name="创建时间",auto_now=True)# 作者:ownerowner = models.ForeignKey(User, verbose_name="作者", on_delete=models.CASCADE)def __str__(self):return self.titleclass Meta:verbose_name = verbose_name_plural = '侧边栏'

blog_config ==> admin.py:编写后台管理

  • ① 先不写,后面根据需求编写
from django.contrib import admin
from .models import Link,SideBar
# Register your models here.@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):# list_display = ("title", "create_time", "count")pass@admin.register(SideBar)
class SideBarAdmin(admin.ModelAdmin):# list_display = ("title", "create_time", "count")pass
  • ② 待写,第三节

2.2.3 comments应用编写

comments ==> models.py:编写数据表

from django.db import models
from blog.models import Post
from django.contrib.auth.models import User
# Create your models here.class Comment(models.Model):""" 评论 """#     ID# 文章(多对一):targettarget = models.ForeignKey(Post, verbose_name="评论目标", on_delete=models.CASCADE)# 用户名:nickname,这里不需要做用户,留名字即可nickname = models.CharField(max_length=50, verbose_name="用户名")# 邮箱:emailemail = models.EmailField(verbose_name="邮箱")# 网站地址:websitewebsite = models.URLField(verbose_name="网站地址")# 内容:contentcontent = models.TextField(verbose_name="评论内容")# 创建时间:created_timecreated_time = models.DateTimeField(verbose_name="评论时间", auto_now=True)def __str__(self):return f'{self.target} by {self.nickname}'class Meta:verbose_name = verbose_name_plural = '评论'

comments ==> admin.py:编写数据表

  • ① 先不写,后面根据需求写
from django.contrib import admin
from .models import Comment
# Register your models here.@admin.register(Comment)
class CommentsAdmin(admin.ModelAdmin):pass
  • ② 待写 ,第三节

2.3 生成数据表

  • 设置好MySQL配置后,执行数据迁移命了
# config ==> settings.py
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'blog','USER': 'blog','PASSWORD':'123456','HOST':'192.168.31.130','PORT':'3306'}
}
# 迁移命令
python manage.py makemigrations 
python manage.py migrate
  • 成功结果
(pyenv) forget@ubuntu:~/Desktop/DjangoDemo/MyBlog$ python manage.py makemigrations
Migrations for 'blog':blog/migrations/0001_initial.py- Create model Category- Create model Tag- Create model Post
Migrations for 'blog_config':blog_config/migrations/0001_initial.py- Create model SideBar- Create model Link
Migrations for 'comments':comments/migrations/0001_initial.py- Create model Comment
****************************************************
(pyenv) forget@ubuntu:~/Desktop/DjangoDemo/MyBlog$ python manage.py migrate
Operations to perform:Apply all migrations: admin, auth, blog, blog_config, comments, contenttypes, sessions
Running migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying auth.0010_alter_group_name_max_length... OKApplying auth.0011_update_proxy_permissions... OKApplying auth.0012_alter_user_first_name_max_length... OKApplying blog.0001_initial... OKApplying blog_config.0001_initial... OKApplying comments.0001_initial... OKApplying sessions.0001_initial... OK
(pyenv) forget@ubuntu:~/Desktop/DjangoDemo/MyBlog$ 

2.4 启动服务

可能8000窗口会被其它占用,因此可另用不常用端口打开如7777

(pyenv) forget@ubuntu:~/Desktop/DjangoDemo/MyBlog$ python manage.py runserver 127.0.0.1:7777
Watching for file changes with StatReloader
Performing system checks...System check identified no issues (0 silenced).
July 03, 2021 - 02:44:18
Django version 3.2.4, using settings 'config.settings'
Starting development server at http://127.0.0.1:7777/
Quit the server with CONTROL-C.
[03/Jul/2021 02:44:20] "GET / HTTP/1.1" 200 10633
[03/Jul/2021 02:44:21] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[03/Jul/2021 02:44:21] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[03/Jul/2021 02:44:21] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
[03/Jul/2021 02:44:21] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
Not Found: /favicon.ico
[03/Jul/2021 02:44:21] "GET /favicon.ico HTTP/1.1" 404 2110
  • 登录admin,查看和分析管理后台各表对应的类型

三、apps admin.py 的修改

将不太符合自己的平时习惯,通过一些自定义方法将其改变

  • list_display:模型首页字段显示修改,
  • fields:模型详情字段显示修改
  • 外键约束一般为必选,需要在fields中加上显示出来,否则需要设置默认值才可
  • save_model方法:用于修改模型的默认值,可避免其它用户修改一些内容作为自己的,修改后可以在fields中不添加。如修改发布文章的作者,通过设置为默认当前用户,其他人就不可以再去更改作者
  • 更多方法参考:Django admin 一些有用的设置

3.1 blog应用编写

blog ==> admin.py:改写CategoryAdmin

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):"""# 添加新的参数"""# step1 定义字段函数def post_count(self, obj):# obj.post_set.count() 意思就是从post表中查询出关于category的分类情况,# 然后通过count函数来对查询各个类别的文章进行统计return f"共{obj.post_set.count()}篇"# step2 修改别名为中文post_count.short_description = "文章数"# 设置模型首页显示的字段,若需要设置新的参数,直接添加函数名即可list_display = ("name", "status", "owner", "is_nav","post_count", "created_time")# 设置模型详情显示的字段内容fields = ("name", "status", "is_nav",)# 字段默认值设置方法def save_model(self, request, obj, form, change):obj.owner = request.user# print(request.user)return super(CategoryAdmin, self).save_model(request, obj, form, change)

blog ==> admin.py:改写TagAdmin

@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):list_display = ("name","owner","created_time","status",)exclude = ("owner",)# 字段默认值设置方法def save_model(self, request, obj, form, change):obj.owner = request.user# print(request.user)return super(TagAdmin, self).save_model(request, obj, form, change)

blog ==> admin.py:改写PostAdmin

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):list_display = ("title", "category", "owner", "status",)exclude = ("owner",)  # 作用与 fields 相反,不显示以下字段"""# 模型首页动作编辑顶部显示与底部显示,数据量多时可上下都添加"""actions_on_top = True  # 默认Trueactions_on_bottom = True  # 默认False"""# 模型详情编辑修改顶部与底部的显示"""save_on_top = True  # 默认Falsesave_on_bottom = True  # 默认True""" 添加查询搜索框 """# search_fields = ("title",) # 添加单个# 涉及外键时,取得话需要加__name# name也可以是其它的字段,如查is_nav字段category__is_navsearch_fields = ("title", "category__name")# 字段默认值设置方法def save_model(self, request, obj, form, change):obj.owner = request.user# print(request.user)return super(PostAdmin, self).save_model(request, obj, form, change)

3.2 blog_config应用编写

blog_config ==> admin.py:改写LinkAdmin

@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):list_display = ("title","owner","href","status","created_time","weight",)exclude = ("owner",)# 字段默认值设置方法def save_model(self, request, obj, form, change):obj.owner = request.user# print(request.user)return super(LinkAdmin, self).save_model(request, obj, form, change)

blog_config ==> admin.py:改写SideBarAdmin

@admin.register(SideBar)
class SideBarAdmin(admin.ModelAdmin):list_display = ("title","owner","display_type","status","created_time")exclude = ("owner",)# 字段默认值设置方法def save_model(self, request, obj, form, change):obj.owner = request.user# print(request.user)return super(LinkAdmin, self).save_model(request, obj, form, change)

3.3 comments应用编写

comments ==> admin.py:改写commentAdmin

@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):list_display = ("target","nickname","email","website","created_time")

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

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

相关文章

社交网站界面设计

社交网站界面设计 基本信息 原书名: Designing Social Interfaces 原出版社: Yahoo Press 作者: (美)Christian Crumlish Erin Malone 译者: 樊旺斌 师蓉 出版社:机械工业出版社 ISBN&…

影视网站被黑客攻击,数百万用户账户被曝光

每天我们都听到有新数据被破坏,每天警告用户个人信息被曝光,他们应该重置密码,并加强安全措施来保护黑客根据他们的信息破解。 今天关注的是一个世界上最大的视频网站,影片下载,上传,观看和分享视频&#x…

[转载]使用IntelliJ IDEA开发SpringMVC网站(一)开发环境

访问GitHub下载最新源码:https://github.com/gaussic/Sp... 文章已针对IDEA 2016做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源码。另外:文中的附图部分仍然为旧版本,请参照自身版本进行配置。 前言 由…

一个自动上色网站

同样是机器学习的一个应用 以前的可以看这个 http://blog.csdn.net/shenmifangke/article/details/56515413 网站是http://color.kvfrans.com/draw 貌似很早就有了 最近体验了下 下面是 上色的测试 又试了试不指认颜色的,其实效果也不错

从零开始利用vue-cli搭建简单音乐网站(八)

这是完成了预想中的最后两个功能:歌曲评论以及歌曲搜索。 1、评论效果: 用户点击评论按钮,评论框获取焦点。 输入之后点击提交,下方显示评论,用户名称以及日期。相应的用户也可以删除自己评论。 当然只能删除自己的评…

从零开始利用vue-cli搭建简单音乐网站(四)

上一篇文章中说到这一篇博客会实现音乐播放功能,只是令我意外的是,如果利用h5的audio标签,几行代码就实现了......先来看一下最终效果吧。 这里直接用了audio标签,样式没有怎么管,能获得音乐文件并且播放就足够了。 所…

免费建站系统 Joomla 3.9.5 发布

开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> Joomla 3.9.5现已推出。这是针对3.x系列Joomla的安全修复程序版本,它解决了三个安全漏洞,包含20多个错误修复和改进。 什么是3.9.5? Joomla 3.9…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书,就应该有所收获,有所总结,最近把《大型网站技术架构》一书给看完了,给人的印象实在深刻,再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

网站优化--让你的网页飞起来

摘要: 网站快要上线了,但是网站打开速度很慢怎么办?这里介绍一下对网页进行优化的方法和技巧,加快网页浏览速度,让网页速度飞起来 测试网页性能工具 ⑴Page Speed: 是开源 Firefox/Firebug 插件。网站管理员…

网站优化--让你的网页飞起来

摘要: 网站快要上线了,但是网站打开速度很慢怎么办?这里介绍一下对网页进行优化的方法和技巧,加快网页浏览速度,让网页速度飞起来 测试网页性能工具 ⑴Page Speed: 是开源 Firefox/Firebug 插件。网站管理员…

让网站飞起来02--服务器缓存

前提提要: 第一个介绍的是《让网站飞起来01---浏览器缓存技术》 介绍服务器,肯定要先支持服务器在网站架构中的位置和作用,然后在介绍几种常见的服务器缓存配置。 正文 对服务器在网站中位置作用有个大概了解:lamp架构图 上图主要…

Digital Ocean 搭建属于自己的网站

首先,需要Digital Ocean账号申请以及环境搭建的参考博客:https://blog.csdn.net/hunzhangzui9837/article/details/85209245 下面,开始Digital Ocean 网站搭建 1、WDCP的安装和管理 WDCP相当于一个服务器管理界面,可以直接在we…

Mozilla出了个网站安全评估工具 93%的网站居然都不合格

2019独角兽企业重金招聘Python工程师标准>>> Mozilla的安全工程师April King发现,世界上绝大多数的网站 - 高达93.45% - 并没有实施许多现代安全技术,为用户提供安全的连接,并保护他们免受跨站点的攻击脚本&#xff08…

构架高性能WEB网站的几点知识

构架高性能WEB网站的几点知识 前言: 对于构架高性能的web网站大家都很感兴趣,本文从几点粗谈高性能web网站需要考虑的问题。 HTML静态化 什么是html静态化? 说得简单点,就是把所有不是.htm或者.html的页面改为.htm或者.html 1.纯静…

高性能建站之前端优化篇

高性能建站之前端优化篇 2011-10-25 17:50 by PHP淮北, 560 visits,收藏,编辑 前言: 这算是对前端优化的总结吧,之前零零星星总结和学习,这次做一个完整的总结。 测试网页性能工具 ⑴Page Speed: 谷歌开发的工具,网…

8个应该去逛逛JQuery的学习网站

根据国外科技网站 W3Techs 一项调查了近100万个网站数据显示,jQuery是目前最流行的 JavaScript 库。对于初学者来说,有的时候很难找到一个好的学习jQuery的网站,所以本文收集了8个很棒的 jQuery 学习网站推荐给大家。 1. Learning jQuery 最…

Hexo博客yilia主题使用cnzz统计网站访问量

使用友盟第三方的统计插件,网址:http://www.umeng.com/ 进入网站先注册账号然后根据下列图片进入添加站点。 添加站点,自己搭建的博客,需要统计访问量的网站(这里加入我的博客网站),然后点击统计代码进入代码页 代码页…

网站刷关键词_关键词快速排名靠谱吗?应该如何判断

企业要想在竞争激烈的市场中,赢得更多用户的关注,如果没有把网站的排名优化到显眼的地方,是很难实现变现的。如果想提升网站的排名,通过不断优化网站关键词而实现的。企业想快速实现关键词排名,于是网络上就出现很多“…

Linux系列-Red Hat5平台下的LAMP网站服务搭建(一

Linux系列-Red Hat5平台下的LAMP网站服务搭建(一) 编译安装Apache服务器&httpd服务的基本配置 LAMP架构是目前最为成熟的一种企业网站应用模式,指的是协同工作的一整套系统和相关软件,能够…

蝉知网站模板常用的Jquery

1.因为蝉知调用到ZUI的缘故&#xff0c;所有class类名会比较多&#xff0c;有时候方便操作样式&#xff0c;常用到去除类名&#xff1a; <p class"chanzhi">Its a wonderful website.</p> 如果class有样式设计复杂影响设计&#xff0c;则可以去除class类…