个人博客小案例(纯Django搭建)
在看这篇文章的时候,必须有django基础,如果没有点击访问
一、环境配置
新建项目并做配置项目创建,创建APP并注册
创建静态文件并配置,点击访问
配置数据库,点击访问
目录结构如下

配置blog的测试页面,先测试是否正确配置
def test(request):
‘’‘
博客的测试的视图函数
’‘’
return HttpResponse('博客的测试页')
运行效果

博客发文涉及文章标题和内容,所以创建模型类
class Blog(models.Model):
title = models.CharField(max_length=100)
context = models.TextField() def __str__(self):
return 'Blog<title=%s,context=%s>'%(self.title,self.context)
继续原来的映射文件
makemigrations 和 migrate
查看表

二、视图
添加四个视图,渲染模板
def index(request):
return render(request,'blog/demo_index.html') def add(request):
return render(request,'blog/demo_add.html') def list(request):
return render(request,'blog/demo_list.html') def detail(request):
return render(request,'blog/demo_detail.html')
配置路由
path('index/',index,name='blog_index'),
path('add/',add,name='blog_add'),
path('detail/',detail,name='blog_detail'),
path('list/',list,name='blog_list')
查看效果

ok,现在分析需求
可以整理如下条例

三、实现功能
1.index
修改demo_index.html 的a标签
<td><a href="{% url 'blog_add' %}">添加文章</a></td>
<td><a href="{% url 'blog_list' %}">文章列表</a></td>
即可实现主页的所有的功能

2.add
创建的视图函数进行修改,这里的发布博客按钮是提交form表单,所以修改之前的模型类,将title属性增加参数 blank=True
然后重新生成映射文件

可以看到,这里的文章标题的id=title,文章内容id=context
要获取提交的表单内容,则要修改视图,以传参的方式将其传递进来并接收
就可以写个样一个判断
if request.method == 'GET':
return render(request,'blog/demo_add.html')
elif request.method == 'POST':
title = request.POST.get('title')
context = request.POST.get('content')
打印一下title和content,发现成功的接收到了自己想要的东西
注意:
这里的requests.POST是一个QueryDict对象,类似字典,所以可以通过索引取值,拿到这里的title和content
整个函数的代码就变成了这样
def add(request):
if request.method == 'GET':
return render(request,'blog/demo_add.html')
elif request.method == 'POST':
title = request.POST.get('title')
context = request.POST.get('content')
return render(request,'blog/demo_add.html')
既然两个分支条件都要渲染出这个模板,就可以修改
def add(request):
if request.method == 'POST':
title = request.POST.get('title')
context = request.POST.get('content')
return render(request,'blog/demo_add.html')
现在拿到了数据,下一步就是数据入库,对django操作数据库不懂的,可以参考模型
这里用create方法
只需要在拿到数据之后 Blog.objects.create(title=title,context=context) 即可
这里准备几篇文章,以供测试
水调歌头
明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在人间?转朱阁,低绮户,照无眠。不应有恨,何事长向别时圆?人有悲欢离合,月有阴晴圆缺,此事古难全。但愿人长久,千里共婵娟。 卜算子·咏梅
驿外断桥边,寂寞开无主。已是黄昏独自愁,更著风和雨。 无意苦争春,一任群芳妒。零落成泥碾作尘,只有香如故。 声声慢
寻寻觅觅,冷冷清清,凄凄惨惨戚戚。乍暖还寒时候,最难将息。三杯两盏淡酒,怎敌他、晚来风急?雁过也,正伤心,却是旧时相识。满地黄花堆积。憔悴损,如今有谁堪摘?守着窗儿,独自怎生得黑?梧桐更兼细雨,到黄昏、点点滴滴。这次第,怎一个愁字了得! 武陵春
风住尘香花已尽,日晚倦梳头。物是人非事事休,欲语泪先流。闻说双溪春尚好,也拟泛轻舟。只恐双溪舴艋舟,载不动许多愁。
测试文章
查看效果

ok文章添加功能完成
3.list
思路:首先从数据库拿到数据 ,然后渲染到模板上
def list(request):
blogs = BlogMoudel.objects.all()
return render(request,"blog/demo_list.html",context={'blog':blogs})
在这里需要将查到的Queryset对象传到模板,然后遍历,所以模板上需要改动tr标签,将其放置在for循环
{% for foo in blog %}
<tr>
<th><a href="">{{ foo.title }}</a></th>
<th><a href="">编辑</a> | <a href="">删除 </a></th>
</tr>
{% endfor %}
效果:

还有个需求,要求点击文章标题就能进入对应的详情页
思路:获取点击时对应的ID,将这个id接收,然后查找该文章,渲染出来
所以这里首先需要做出详情页的功能
4.detail
分析进入详情页的url,是需要有一个值来确定是哪一篇文章,所以可以在url里传参
path('detail/<blog_id>',views.detail,name='blog_detail'),
视图函数里查找数据库
def detail(request,blog_id):
blog = BlogMoudel.objects.get(id=blog_id) #查找指定id的文章
return render(request,"blog/demo_detail.html",context={'blog':blog}) #将变量传递到模板
模板修改只需要修改文章标题和内容的一块区域
{% block bodyblock %}
<h1>{{ blog.title }}</h1>
{{ blog.context }}
{% endblock %}
看下效果

详情页到这里就完成,现在只需要将url绑定到列表页即可
直接修改demo_list.html,在编辑的a标签连接上修改
<th><a href="{% url 'blog_detail' foo.id %}">{{ foo.title }}</a></th>
查看效果

这里还有删除的按钮,现在实现删除
思路:获取id,查找数据库,删除
同样要知道需要删除哪篇文章,需要传参,定义一个删除的url
path('delete/<blog_id>/',views.delete,name='blog_delete'),
然后创建一个视图函数
def delete(request,blog_id):
blog = BlogMoudel.objects.filter(id=blog_id)
if blog:
blog.delete()
return HttpResponse('成功删除')
else:
return HttpResponse('该文不存在')
函数逻辑很简单,获取文章,删除文章
修改模板
<a href="{% url 'blog_delete' foo.id %}">删除 </a>
但是这里同时发现一个问题,就是删除之后,页面并没有刷新,继续点击则会报错,所以这里可以定义一个页面重定向
def delete(request,blog_id):
blog = BlogMoudel.objects.filter(id=blog_id)
if blog:
blog.delete()
redirect(reverse('blog_list'))
else:
return HttpResponse('该文不存在')
效果

最后有个编辑的页面
5.edit
编辑功能类似增加,同样是写个url
path('edit/<blog_id>/',views.edit,name='blog_edit'),
然后视图函数
def edit(request,blog_id):
blog = BlogMoudel.objects.filter(id=blog_id).first()
return render(request,'blog/demo_edit.html',context={'blog':blog})
逻辑很简单,就是获取文章,获取的对象是一个Queryset对象,然后.first()获取,再返回回去
继续修改edit.html文件,其实就是demo_add.html文件,将其更名修改即可
<form action="" method="POST"> {% csrf_token %}
标题<input type="text" autocomplete="off" id="title"
placeholder="请输入标题" name='title' value="{{ blog.title }}"> <br> <br><br>
内容 <textarea name="content" id="content"
placeholder="请输入内容" cols="30" rows="10">{{ blog.context }}</textarea>
<button type="submit">发布博客</button>
</form>
效果

至此,简单的博客就搭建完成了,其他的功能将会在后续的学习中逐步添加
以后的django基础文章也会围绕这个案例展开讨论
本文为素心原创,转载请注明出处
个人博客小案例(纯Django搭建)的更多相关文章
- Django 09 博客小案例
Django 09 博客小案例 urls.py from django.urls import path from . import views urlpatterns = [ path('index ...
- Django——9 博客小案例的实现
Django 博客小案例的实现 主要实现博客的增删改查功能 主页index.html --> 展示添加博客和博客列表的文字,实现页面跳转 添加页add.html --> 输入文章标 ...
- 潭州课堂25班:Ph201805201 django框架 第九课 模型补充 博客小案例 (课堂笔记)
聚合查询: 分组查询: annotate() 方法 例:查询某学院学生人数,(一对多查询) 以字典的形式输出 annotate(统计 ‘关联学生字段 出现的次,).字典形式(键,值) 例:查询每项课程 ...
- 一文搭建自己博客/文档系统:搭建,自动编译和部署,域名,HTTPS,备案等
本文纯原创,搭建后的博客/文档网站可以参考: Java 全栈知识体系.如需转载请说明原处. 第一部分 - 博客/文档系统的搭建 搭建博客有很多选择,平台性的比如: 知名的CSDN, 博客园, 知乎,简 ...
- 基于开源博客系统(mblog)搭建网站
基于开源博客系统(mblog)搭建网站 上一章讲了基于jpress部署的博客系统,这一章了解一下 mblog这个开源的基于springboot的博客系统,相比与jpress 的热度fork数量要少一些 ...
- Hexo博客(Snail主题)搭建回顾概览
Hexo博客(Snail主题)搭建回顾概览 笔者搭建博客地址:https://saltyfishyjk.github.io 目录 Hexo博客(Snail主题)搭建回顾概览 Part 0 前言 写作背 ...
- 微信小程序--简约风博客小程序(基于云开发 - 全开源)
微信小程序--简约风博客小程序(基于云开发 - 全开源) 项目启动纯属突发奇想,想看看博客小程序,例如wehalo博客小程序,但是感觉自建平台还要浪费自己的服务器算力,还没有访问量,省省吧. 本着白嫖 ...
- 基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 基于开源博客系统(jpress)搭建网站
基于开源博客系统(jpress)搭建网站 JPress 使用 Java8 开发,基于流行的JFinal和Jboot框架. 目前JPress已经内置的文章和页面其实是两个模块,可以移除和新增其他模块,因 ...
随机推荐
- Swift是一个提供RESTful HTTP接口的对象存储系统,目的是为了提供一个和AWS S3竞争的服务
Swift是一个提供RESTful HTTP接口的对象存储系统,最初起源于Rackspace的Cloud Files,目的是为了提供一个和AWS S3竞争的服务. Swift于2010年开源,是Ope ...
- win10+vs2008编译比特币1.0版源码总结
https://zhuanlan.zhihu.com/p/25074960 https://zhuanlan.zhihu.com/p/25095222 总体上是参考这两个链接,感谢大神的分享,但是中间 ...
- postgresql 自带函数
替换函数 SELECT replace('abcdefabcdef', 'cd', 'XX') 得到 abXXefabXXef ------------------------------------ ...
- Servlet的基础知识
没有什么固定的结构, 就是稍微总结一下学习到的, 基本上想到哪里写到哪里. 关于基本的最HttpServlet 实际上Servlet是J2EE(也就是现在的Java EE)中规范的一个接口, 用于根据 ...
- 【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例
原文:[WPF]wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例 用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题, ...
- Python编写AWS Version 4 signing (AWS4-HMAC-SHA256) for execute-api
官网教程中给了签署AWS请求给了详细的介绍和python的例子,但是例子针对DynamoDB API,本例子针对API Gateway的POST请求,并携带有x-amz-security-token. ...
- Image Paragraph论文合辑
A Hierarchical Approach for Generating Descriptive Image Paragraphs (CPVR 2017) Li Fei-Fei. 数据集地址: h ...
- InstallUtil.exe版本引起安装windows services 服务遇到的问题,System.BadImageFormatException
原文:把程序安装成windows服务的过程及遇到的问题 做好了定时任务的程序,要把它放在服务器上,作为windows服务运行,也就是说,退出登录,用户注销后程序任然在后台运行. 将exe程序发布为服务 ...
- iOS中的加密操作
最近项目中用到了一些加密操作,在这里简单总结了一下.总的来说加密分为对称加密和非对称加密两种,下面对这两种加密方式作一个简单的说明. 对称加密(Symmetric Cryptography) 对称加密 ...
- Android零基础入门第6节:配置优化SDK Manager,正式约会女神
原文:Android零基础入门第6节:配置优化SDK Manager,正式约会女神 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Androi ...