基于django的个人博客网站建立(二)

news/2024/5/9 5:17:33/文章来源:https://blog.csdn.net/weixin_34176694/article/details/93707793

基于django的个人博客网站建立(二)

前言

网站效果可点击这里访问


今天主要完成后台管理员登录的状态以及关于文章在后台的处理

具体内容

首先接上一次内容,昨天只是完成了一个登录的跳转,其他信息并没有保存到session中,今天先完善一下

在用户登录时,先设置了一下session


request.session['is_login'] = True
request.session['email'] = value_dict['email']
request.session['username'] = obj.userName

然后再建立装饰器来对一些需要登录的请求做限制


def auth(func):def inner(request, *args, **kwargs):is_login = request.session.get('is_login')if is_login:return func(request, *args, **kwargs)else:return redirect('/backend/login')return inner

接下来就是对文章在后台的管理的添加

首先当然是建表:


class ArticleType(models.Model):name = models.CharField(max_length=128,unique=True)class Article(models.Model):title = models.CharField(max_length=128)markdownContent = models.TextField(default='')htmlContent = models.TextField()creationTime = models.DateTimeField(auto_now_add=True)class ArticleToType(models.Model):article = models.ForeignKey(to=Article,on_delete=models.CASCADE)type = models.ForeignKey(to=ArticleType,on_delete=models.CASCADE)class Meta:unique_together = ('article', 'type',)

这里建立了3张表,表示文章与类型,文章内容存了两种,一种是markdown,一种是html格式

然后要完成的是对文章类型的管理,主要是显示文章类型,添加文章类型与删除文章类型

我先把完成的网页放出来:

对于页面的返回的视图函数当然要查询所有类别:


@auth
def article_type(request):if request.method == 'GET':all_type = models.ArticleType.objects.all()return render(request,'backend/article_type.html',{"all_type":all_type})

然后是添加类别:


@auth
def add_article_type(request):if request.method == 'POST':addType = request.POST.get('addType')if addType:print(addType)count = models.ArticleType.objects.filter(name=addType).count()if count:messages.error(request, '添加的类别已经存在')else:models.ArticleType.objects.create(name=addType)else:messages.error(request, '添加的类别不能为空')return redirect('/backend/article_type')

这里使用了django中的message,它和flask中的flash类似,可以用来显示错误信息

然后是删除类别;


@auth
def delete_article_type(request):if request.method == 'POST':delete_type_id = request.POST.get('delete_type_id')if delete_type_id:obj = models.ArticleType.objects.filter(id=delete_type_id).first()if obj:obj.delete()else:messages.error(request, '删除的类别不存在')else:messages.error(request, '删除的类别不能为空')return redirect('/backend/article_type')

具体的页面借助了模板,也就不再解释了


{% extends 'backend/base.html' %}{% block link %}<!-- Bootstrap Markdown -->{% endblock %}{% block content %}<div class="content-wrapper"><!-- Content Header (Page header) --><section class="content-header"><h1>文章类别</h1><ol class="breadcrumb"><li class="breadcrumb-item"><a href="#">我的博客后台</a></li><li class="breadcrumb-item active">文章类别</li></ol></section><!-- Main content --><section class="content"><div class="row"><div  class="col-lg-12"><div class="box"><div class="box-header with-border"><h3 class="box-title">所有类别</h3></div><!-- /.box-header --><div style="height: auto"  class="box-body"><div class="table-responsive"><table id="articletypelist" class="table table-hover no-wrap dataTable" data-page-size="10" role="grid" aria-describedby="articletypelist_info"><thead><tr role="row"><th class="sorting_asc" tabindex="0" aria-controls="articletypelist" rowspan="1" colspan="1" aria-sort="ascending" aria-label="No: activate to sort column descending">Id</th><th class="sorting" tabindex="0" aria-controls="articletypelist" rowspan="1" colspan="1" aria-label="Name: activate to sort column ascending">Type</th><th class="sorting" tabindex="0" aria-controls="articletypelist" rowspan="1" colspan="1" aria-label="Action: activate to sort column ascending">Action</th></tr></thead><tbody>{% for type in all_type %}<tr role="row" class="odd"><td class="sorting_1">{{ type.id }}</td><td>{{ type.name }}</td><td><form action="/backend/delete_article_type/" method="post">{% csrf_token %}<input name="delete_type_id" style="display: none" type="text" value="{{ type.id }}"><button type="submit" class="btn btn-sm btn-danger-outline" data-toggle="tooltip" data-original-title="Delete"><i class="ti-trash" aria-hidden="true"></i></button></form></td></tr>{% endfor %}</tbody></table></div></div></div><div class="box"><div class="box-header with-border"><h3 class="box-title">添加类别</h3></div><!-- /.box-header --><div style="height: auto"  class="box-body"><form method="post" action="/backend/add_article_type/"><input name="addType" type="text" class="form-control" placeholder="输入类别"><button type="submit" class="btn btn-info margin-top-10">添加</button>{% csrf_token %}</form></div></div><!-- /.box --></div></div></section><!-- /.content --></div>{% endblock %}{% block script %}<script>$('#article_type').addClass('active')</script>{% endblock %}

接下来就是文章的添加:

这里用的是markdown编辑器,可以预览

在后台先pip安装markdown,用于对markdown到html的转换

页面的视图函数为;


@auth
def write_article(request):if request.method == 'GET':all_type = models.ArticleType.objects.all()return render(request, 'backend/write_article.html',{'all_type':all_type})if request.method == 'POST':markdown_content = request.POST.get('content')html_content = markdown(markdown_content)type_list = request.POST.getlist('article_type')type_list = [int(i) for i in type_list]title = request.POST.get('title')type_obj_list = []for i in type_list:type_obj = models.ArticleType.objects.filter(id=i).first()type_obj_list.append(type_obj)if html_content and type and title:obj = models.Article.objects.create(title=title,markdownContent=markdown_content,htmlContent=html_content)for i in type_obj_list:models.ArticleToType.objects.create(type=i,article=obj)return redirect('/backend/write_article')else:messages.error('文章或类别或标题不能为空')return redirect('/backend/write_article')

前端代码为:


{% extends 'backend/base.html' %}{% block link %}<!-- Bootstrap Markdown --><link rel="stylesheet" href="/static/assets/backend/vendor_components/bootstrap-markdown-master/css/bootstrap-markdown.css">{% endblock %}{% block content %}<div class="content-wrapper"><!-- Content Header (Page header) --><section class="content-header"><h1>写文章</h1><ol class="breadcrumb"><li class="breadcrumb-item"><a href="#">我的博客后台</a></li><li class="breadcrumb-item active">写文章</li></ol></section><!-- Main content --><section class="content"><div class="row"><div  class="col-lg-12"><form action="/backend/write_article/" method="post"><div class="box"><div class="box-header with-border"><input name="title" type="text" class="form-control" placeholder="输入标题"></div><!-- /.box-header --><div style="height: auto"  class="box-body"><div class="example"><textarea style="height: 500px" name="content" data-provide="markdown" data-iconlibrary="fa"></textarea></div></div><!-- /.box-body --></div><div class="box"><div class="box-header with-border"><h3 class="box-title">选择类别</h3></div><!-- /.box-header --><div style="height: auto"  class="box-body"><div class="form-group validate"><h5>选择分类 <span class="text-danger">*</span></h5><div class="controls">{% for type in all_type %}<fieldset><label class="custom-control custom-checkbox"><input type="checkbox" value="{{ type.id }}" name="article_type"  class="custom-control-input" aria-invalid="false"> <span class="custom-control-indicator"></span> <span class="custom-control-description">{{ type.name }}</span> </label></fieldset>{% endfor %}</div></div><button id="submit" type="submit" class="btn btn-info margin-top-10">提交</button>{% csrf_token %}</div></form><!-- /.box --></div></div></section><!-- /.content --></div>{% endblock %}{% block script %}<script>$('#write_article').addClass('active')$('#submit').click(function () {var cbs = document.getElementsByName("article_type");var checkNum = 0;for (var i = 0; i < cbs.length; i++) {if (cbs[i].checked) {checkNum++;}}if (checkNum == 0) {alert('至少选择一个类别');return false;}})</script><!-- Bootstrap markdown --><script src="/static/assets/backend/vendor_components/bootstrap-markdown-master/js/bootstrap-markdown.js"></script><!-- marked--><script src="/static/assets/backend/vendor_components/marked/marked.js"></script><!-- to markdown --><script src="/static/assets/backend/vendor_components/to-markdown/to-markdown.js"></script>
{% endblock %}

最后是查看文章,这个和文章分类的类似,用一个表格展示

视图函数为;


@auth
def view_article(request):if request.method == 'GET':all_article = models.Article.objects.all().order_by('id').reverse()return render(request,'backend/view_article.html',{'all_article':all_article})

点击右边的按钮是具体查看文章,也就是可以再次编辑:

点击查看按钮的视图函数为:


@auth
def view_article_detail(request):if request.method == 'GET':view_article_id = request.GET.get('view_article_id')article = models.Article.objects.filter(id = int(view_article_id)).first()return render(request,'backend/view_article_detail.html',{'article':article})

点击保存按钮的视图函数为:


@auth
def save_article(request):if request.method == 'POST':markdown_content = request.POST.get('content')html_content = markdown(markdown_content)title = request.POST.get('title')article_id = request.POST.get('article_id')article_obj = models.Article.objects.filter(id=int(article_id)).first()article_obj.title = titlearticle_obj.markdownContent = markdown_contentarticle_obj.htmlContent = html_contentarticle_obj.save()return redirect('/backend/view_article')

这个页面在前端其实就是把数据库该文章的内容填充进去:


{% extends 'backend/base.html' %}{% block link %}<!-- Bootstrap Markdown --><link rel="stylesheet" href="/static/assets/backend/vendor_components/bootstrap-markdown-master/css/bootstrap-markdown.css">{% endblock %}{% block content %}<div class="content-wrapper"><!-- Content Header (Page header) --><section class="content-header"><h1>修改文章</h1><ol class="breadcrumb"><li class="breadcrumb-item"><a href="#">我的博客后台</a></li><li class="breadcrumb-item active">查看文章</li><li class="breadcrumb-item active">修改文章</li></ol></section><!-- Main content --><section class="content"><div class="row"><div  class="col-lg-12"><form action="/backend/save_article/" method="post"><div class="box"><div class="box-header with-border"><input value="{{ article.title }}" name="title" type="text" class="form-control" placeholder="输入标题"></div><!-- /.box-header --><div style="height: auto"  class="box-body"><div class="example"><textarea style="height: 500px" name="content" data-provide="markdown" data-iconlibrary="fa">{{ article.markdownContent }}</textarea><input type="text" style="display: none" name="article_id" value="{{ article.id }}"></div><button id="submit" type="submit" class="btn btn-info margin-top-10">保存</button>{% csrf_token %}</div><!-- /.box-body --></div></form><!-- /.box --></div></div></section><!-- /.content --></div>{% endblock %}{% block script %}<script>$('#view_article').addClass('active')</script><!-- Bootstrap markdown --><script src="/static/assets/backend/vendor_components/bootstrap-markdown-master/js/bootstrap-markdown.js"></script><!-- marked--><script src="/static/assets/backend/vendor_components/marked/marked.js"></script><!-- to markdown --><script src="/static/assets/backend/vendor_components/to-markdown/to-markdown.js"></script>
{% endblock %}

总结

这次基本上完成了个人博客文章在后台的管理,其实还是花了不少的时间,很多时间是对html页面的设置,修改,明天预计完成文章在前端页面的展示。

转载于:https://www.cnblogs.com/sfencs-hcy/p/10926511.html

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

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

相关文章

大型网站架构演化概览

1.大型网站的特点&#xff1a; 相比传统企业应用系统&#xff0c;大型互联网应用系统有以下特点&#xff1a; 高并发、大流量&#xff1a;需要面对高并发用户&#xff0c;大流量访问。高可用&#xff1a;系统需要7*24小时不间断服务。海量数据&#xff1a;需要储存、管理海量数…

asp自助建站系统_凡科建站对于seo优化友好吗?

最早之前的凡科可以说&#xff0c;开始确实对百度SEO优化是不利&#xff0c;这也不他一家的问题&#xff0c;起初自助建站系统仅仅是为了降门槛让更的企业有网站。后面随着市场的需求和企业对功能的要求&#xff0c;国内绝大部分的自助建站系统对SEO进行了重点优化和改进。如阿…

用java实现楼层导航_JS实现网站楼层导航效果

壹 ❀ 引我在angularjs中使用锚点这篇文章中&#xff0c;踩坑并简单实现了楼层导航中点击小图标跳转到对应楼层的功能&#xff1b;但对于楼层导航而言&#xff0c;还有个重要的功能就是&#xff0c;随着滚动条滚动&#xff0c;达到某层时得同步点亮楼层导航的小图片。由于我前面…

html+浏览器自动全屏,web 使网站在浏览器中全屏显示 fullscreen=yes

关需朋者说上事是础一发一开程和开数的目前间于全屏(FullScr新直能分支调二浏页器朋代说&#xff0c;事刚een)很久以前它不曾明机式近扯多相显端幻近扯多相显端幻&#xff0c;浏览器就已经有全屏的概念的了。IE的open方法中可以配置上FullScreen参数来让打开的页面全屏化。但是…

网站建设教程:虚拟主机如何安装PageAdmin建站系统

想要做一个网站&#xff0c;可以选择的建站程序有很多种&#xff0c;如PageAdmin、Discuz、zblog等等。每个建站程序都有它独特的优势&#xff0c;如discuz适合一般的论坛社区&#xff0c;zblog则适用于博客类网站&#xff0c;而PageAdmin就是通用性网站系统。 PageAdmin是一套…

美术 建模3D模型网站推荐

免费游戏引擎专用商店 Unity 商店&#xff1a;Unity Asset Store - The Best Assets for Game Making Unreal 商城&#xff1a;Marketplace - UE Marketplace 以上商店资源只能用在自有引擎中&#xff08;不能把Unity商店资源用在UE4商业项目中&#xff09; 以下网站排名不…

CSDN盗版网站https://www.twblogs.net/

https://www.twblogs.net/这个盗用连接网站&#xff0c;把所有CSDN的博客全都复制了一遍。把文字转成了繁体,估计是应该不是大陆地区.... 各位可以搜索任意博客名字。 压根就没注册过...平白无故上了盗版网站 问了下CSDN的客服&#xff0c;他们不管这事》。。。。 广电总局侵…

美术-常用免费贴图网站分享

https://ambientcg.com/ 免费材质下载&#xff0c;无限制&#xff0c;资源较多 ambientCG - Free Public Domain PBR Materialshttps://ambientcg.com/ https://www.poliigon.com/ 部分免费&#xff0c;无限制&#xff0c;免费资源 Poliigon - Library of textures, model…

一些收藏默认网站后缀

菜刀链接密码默认 /plus/90sec.php||||尝试用菜刀连接--密码 guige /plus/spider.php||||spider菜刀连接 /plus/x.php||||m菜刀密码m /plus/service.php||||尝试用菜刀连接--密码 fuwu /plus/av.php||||尝试用菜刀连接--密码 110 /plus/bakup.hp||||尝试用菜刀连接--密码 mb /p…

SEO优化技术的简介

严格来讲&#xff0c;seo技术没有所谓的严格的黑帽与白帽之分。即使是正常的301重定向&#xff0c;在某些情况下也能作用于黑帽seo技术。我们能判定一个人是真正的好人还是坏人么&#xff1f;答案是否定的。之所以解密所谓的黑帽seo&#xff0c;是想满足很多朋友的遐想。 一说到…

html登录页面源码_今日头条新闻资讯网站源码模板 带手机版,无采集规则失效...

此火车头采集规则已经失效 需要火车头采集规则的请自己重新编写源码名称&#xff1a; 仿《今日头条》网站程序开发环境&#xff1a;PHP帝国cms 7.2 GBK空间支持&#xff1a;PHP MySQL使用帝国7.2 GBK版二次开发&#xff0c;程序具有极好的稳定&#xff0c;安全&#xff0c;高性…

免费python培训网站_免费学习Python编程的3个优秀的网站资源

用Python编写代码一点都不难&#xff0c;事实上它一直被赞誉为最容易学的编程语言。如果你准备学习web开发&#xff0c; Python是一个不错的开始&#xff0c;甚至想做游戏的话&#xff0c;用Python来开发游戏的资源也有很多。这是快速学习这门语言的途径之一。 本人对于Python学…

python combinations_「combinations」itertools.combinations()结构及上下文||组合 - seo实验室...

combinations itertools 官方文档 itertools是2.3版本加入的用于创建循环用迭代器的函数模块。 itertools 模块提供的迭代器函数有以下几种类型&#xff1a;无限迭代器&#xff1a;生成一个无限序列&#xff0c;比如自然数序列 1, 2, 3, 4, ...&#xff1b; 有限迭代器&#xf…

利用其他网站的搜索结果_社交媒体在线上旅游信息搜索中的作用

互联网和即时通讯技术的飞速发展使得社交媒体成为热点&#xff0c;改变了用户的社交网络并突出了用户的核心地位。小红书等社交媒体也成为旅行者获取信息的重要来源。Zheng Xiang和Ulrike Gretzel两位学者在这一背景下探究了社交媒体出现在搜索引擎中的程度&#xff0c;证实了社…

scrapy 搜索关键字_解析搜索引擎抓取网站目标关键词原理

一个网站有几百甚至几千个关键词&#xff0c;怎么让搜索引擎知道网站的目标关键词是什么呢&#xff1f;解析搜索引擎抓取网站目标关键词原理一、网站标题(Title)&#xff0c;网站标题是搜索引擎最重视的部分&#xff0c;通常情况下&#xff0c;无论网站是否存在keywords标签和d…

php 开源产品,PHP免费开源企业产品建站系统含手机站

本系统采用PHPmysql/access/sqlite免费建站整站系统&#xff0c;所有源码开源完整&#xff0c;支持手机自动同步。zzzphp功能1.支持mysql&#xff0c;sqlite&#xff0c;access三种数据库。2.模板和标签与asp版的zzzcms通用。3.asp版的zzzcms的access数据库可直接使用。4.支持手…

go-micro examples 中web form 代码学习(web类 网站的微服务架构:micro api + micro web + web service + api service)

以下对应 example/web 例子&#xff1a; main.go 代码如下&#xff1a; package mainimport ("fmt""log""net/http""github.com/micro/go-micro/web" )func helloWorldHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprint…

css网页favicon_设置网站图标(favicon)

每个网站都有自己的图标(favicon)&#xff0c;除了便于识别与书签收藏&#xff0c;也是一个厂牌吧。浏览器可以将favicon显示于浏览器的地址栏中&#xff0c;也可置于书签列表的网站名前&#xff0c;还可以放在标签式浏览界面中的页标题前。但是我们自己的网站&#xff0c;例如…

百度统计ajax,web网站统计工具之“百度统计”

百度统计是什么&#xff1f;百度统计是百度推出的一款免费的专业网站流量分析工具&#xff0c;能够告诉用户访客是如何找到并浏览用户的网站&#xff0c;在网站上做了些什么&#xff0c;有了这些信息&#xff0c;可以帮助用户改善访客在用户的网站上的使用体验。百度统计有什么…

修改网站首页批处理_天门关键词优化_推荐实用的关键词拓展工具弥补网站排名少的缺憾...

发布时间:2020-11-15 21:11:31SEO优化师将工作核心放在高质量的内容建设&#xff0c;为网站创建更多的信息内容&#xff0c;但是网站关键词排名仍然是少数。有哪些方法或者工作可以拓展关键词呢&#xff1f;接下来&#xff0c;优帮云小编将为您介绍关键词扩展工具和方法&#x…