Django 09 博客小案例

  urls.py

from django.urls import path
from . import views urlpatterns = [
path('index/',views.index,name='blog_index'),
path('add/',views.add,name='blog_add'),
path('list/',views.list,name='blog_list'),
path('detail/<blog_id>/',views.detail,name='blog_detail'),
path('edit/<blog_id>/',views.edit,name='blog_edit'),
path('delete/<blog_id>/',views.delete,name='blog_delete'),
]

  views.py

from django.shortcuts import render,redirect,reverse

# Create your views here.
from .models import Blog
from django.http import HttpResponse def index(request):
'''
主页
'''
return render(request,'blog/demo_index.html') def add(request):
'''
添加页
'''
if request.method == 'GET': #若未点击添加,则进入这个页面的时候method就是GET
return render(request,'blog/demo_add.html')
elif request.method == 'POST': #若点击添加,method变成POST,就可以获取POST中的添加信息(queryset)
title = request.POST.get('title') #赋值title
content = request.POST.get('content') #赋值content
if title == '' and content == '': #如果title和content都为空,则重新输入内容,不传入数据库
return redirect(reverse('blog_add'))
else: #否则传入数据库
blog=Blog(title=title,content=content)
blog.save()
return redirect(reverse('blog_add'))
else:
return HttpResponse('这不是一个有效的') def list(request):
'''
列表页
'''
blog_list = Blog.objects.all() #从数据库中获取表的所有数据
return render(request,'blog/demo_list.html',
context={'blog_list':blog_list, #传入模板
}) def detail(request,blog_id):
'''
详情页
'''
blog = Blog.objects.get(id=blog_id) #根据获取的id来查询这条数据
return render(request,'blog/demo_detail.html',
context={'blog':blog}) #传入模板 def edit(request,blog_id):
'''
修改页
'''
if request.method == 'GET': #如果为点击修改,method为GET
blog = Blog.objects.get(id = blog_id)
return render(request,'blog/demo_edit.html',
context={
'blog':blog, #将该页内容传入修改框内
})
elif request.method == 'POST': #若以点击修改,则method变为POST
content = request.POST.get('content') #获取POST中的content
title = request.POST.get('title') #获取POST中的title
if content == '' and title == '': #如果content和title同时为空,则不传入数据库
return render(request,'blog/demo_edit.html')
else: #否则,覆盖原内容,传入数据库
blog = Blog.objects.get(id = blog_id)
blog.title = title
blog.content = content
blog.save()
return redirect(reverse('blog_list'))
else:
return HttpResponse('这不是一个有效的') def delete(request,blog_id):
'''
删除页
'''
blog = Blog.objects.get(id=blog_id)
if blog: #如果blog存在,则删除
blog.delete()
return redirect(reverse('blog_list'))
else:
return HttpResponse('没有这篇博客')

  add模板(添加页)

{% extends 'blog/demo_base.html' %}
{% block title %}
添加博客
{% endblock %}
{% block bodyblock %}
<h1>添加新文章</h1>
<form action="" method="POST"> {% csrf_token %} <!csrf是为了防止跨域攻击的,加上就行;POST中存储你所输入的内容(title,content)>
标题<input type="text" autocomplete="off" id="title"
placeholder="请输入标题" name='title'> <br> <br><br>
内容 <textarea name="content" id="content"
placeholder="请输入内容" cols="30" rows="10"></textarea>
<button type="submit">发布博客</button>
</form>
{% endblock %}

  base模板(基页)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} {% endblock %}</title>
</head>
<body>
{% block bodyblock %} {% endblock %} </body>
</html>

  detail模板(详情页)

{% extends 'blog/demo_base.html' %}
{% block title %}
文章详情
{% endblock %}
{% block bodyblock %}
<h1>文章标题:{{ blog.title }}</h1>
文章内容 <br>
{{ blog.content }}
{% endblock %}

  edit模板 (修改页)

{% extends 'blog/demo_base.html' %}
{% block title %}
修改博客
{% endblock %}
{% block bodyblock %}
<h1>修改文章</h1>
<form action="" method="POST"> {% csrf_token %}
标题<input type="text" autocomplete="off" id="title"
placeholder="请输入标题" name='title' value="{{ blog.title }}"> <br> <br><br> <! 原题目写在前面的value里面>
内容 <textarea name="content" id="content"
placeholder="请输入内容" cols="30" rows="10">{{ blog.content }}</textarea> <!原内容写在textarea标签内>
<button type="submit">修改博客</button>
</form>
{% endblock %}

  index模板(主页)

{% extends 'blog/demo_base.html' %}

{% block title %}
首页
{% endblock %} {% block bodyblock %}
<tr>
<td><a href="{% url 'blog_add' %}">添加文章</a></td> <!a标签实现跳转,url为前面add的name>
<td><a href="{% url 'blog_list' %}">文章列表</a></td>
</tr>
{% endblock %}

  list模板 (列表页)

{% extends 'blog/demo_base.html' %}
{% block title %}
文章列表
{% endblock %} {% block bodyblock %}
<h1 style="margin-left: 100px">文章列表</h1>
<table width="400px">
<thead style="font-size:20px">
<tr>
<th>标题</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for blog in blog_list %}
<tr>
<th><a href="{% url 'blog_detail' blog.id %}">{{ blog.title }}</a></th> <!因为跳转的是指定的内容,所以必须加上blog.id>
<th><a href="{% url 'blog_edit' blog.id %}">编辑</a> |
<a href="{% url 'blog_delete' blog.id %}">删除 </a></th>
</tr>
{% endfor %} </tbody>
</table> {% endblock %}

  

Django 09 博客小案例的更多相关文章

  1. Django——9 博客小案例的实现

    Django  博客小案例的实现 主要实现博客的增删改查功能 主页index.html  -->  展示添加博客和博客列表的文字,实现页面跳转 添加页add.html  --> 输入文章标 ...

  2. 个人博客小案例(纯Django搭建)

    在看这篇文章的时候,必须有django基础,如果没有点击访问 一.环境配置 新建项目并做配置项目创建,创建APP并注册 创建模板并配置相应的路径,点击下载模板,配置方法点击访问 创建静态文件并配置,点 ...

  3. 潭州课堂25班:Ph201805201 django框架 第九课 模型补充 博客小案例 (课堂笔记)

    聚合查询: 分组查询: annotate() 方法 例:查询某学院学生人数,(一对多查询) 以字典的形式输出 annotate(统计 ‘关联学生字段 出现的次,).字典形式(键,值) 例:查询每项课程 ...

  4. Django搭建博客网站(三)

    Django搭建博客网站(三) 第三篇主要记录view层的逻辑和template. Django搭建博客网站(一) Django搭建博客网站(二) 结构 网站结构决定我要实现什么view. 我主要要用 ...

  5. Django练习——博客系统小试

    在上一篇博客Todolist的基础上(http://blog.csdn.net/hcx25909/article/details/24251427),本周继续进行实践,这次我要搭建一个简单的博客系统. ...

  6. Django 系列博客(十三)

    Django 系列博客(十三) 前言 本篇博客介绍 Django 中的常用字段和参数. ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True.当 model ...

  7. Django 系列博客(十二)

    Django 系列博客(十二) 前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询. 聚合查询 语法:aggregate(*args, **kwargs) ...

  8. Django 系列博客(十)

    Django 系列博客(十) 前言 本篇博客介绍在 Django 中如何对数据库进行增删查改,主要为对单表进行操作. ORM简介 查询数据层次图解:如果操作 mysql,ORM 是在 pymysql ...

  9. Django 系列博客(六)

    Django 系列博客(六) 前言 本篇博客介绍 Django 中的路由控制部分,一个网络请求首先到达的就是路由这部分,经过路由与视图层的映射关系再执行相应的代码逻辑并将结果返回给客户端. Djang ...

随机推荐

  1. 部署和调优 1.6 vsftp部署和优化-2

    映射个虚拟用户 创建个用户,不让他登录 useradd virftp -s /sbin/nologin 创建存放虚拟用户用户和密码的文件 vim /etc/vsftpd/vsftpd_login 写入 ...

  2. C++深度解析教程学习笔记(2)C++中的引用

    1.C++中的引用 (1)变量名的回顾 ①变量是一段实际连续存储空间的别名,程序中通过变量来申请并命名存储空间 ②通过变量的名字可以使用存储空间.(变量的名字就是变量的值,&变量名是取地址操作 ...

  3. 用sass的minix定义一些代码片段,且可传参数

    /** *@module功能 *@description生成全屏方法 *@method fullscreen *@version 1.7.0 *@param{Integer}$z-index 指定层叠 ...

  4. Apollo问题

    1.安装问题: 一不小心安装了NVIDIA,导致bash docker/scripts/dev_start.sh无法启动:[ERROR] Failed to start docker containe ...

  5. Struts2框架01【如果使用struts框架】【利用struts框架写一个 hello world】

    1 什么是Struts2框架 基于MVC设计模式的web应用框架 Struts2框架是一个轻量级的MVC流程框架 轻量级是指程序的代码不是很多,运行时占用的资源不是很多,MVC流程框架就是说它是支持分 ...

  6. js的学习

    对于 ff的 relatedTarget    及IE的toElement  fromElement DOM通过event对象的relatedTarget属性提供了相关元素的信息.这个属性只对于mou ...

  7. java全栈day13----Eclipse项目的jar包导出与使用jar包

    01eclipse快捷键 Ctrl+T:查看所选中类的继承树 例如,在下面代码中,选中Teacher类名,然后按Ctrl+T,就会显示出Teacher类的继承关系 * B: 查看所选中方法的源代码 ...

  8. c# 的默认访问修饰符小结(转)

    c# 的访问修饰符是private 还是 internal? 准确的说,不能一概而论. [MSDN] Classes and structs that are not nested within ot ...

  9. Jstl标签<c:if>的用法

    <c:if> 标签必须要有test属性,当test中的表达式结果为true时,则会执行本体内容:如果为false,则不会执行.例 如:${requestScope.username = = ...

  10. android studio中Fragment使用webview返回上一页的问题

    在Fragment中使用了腾讯的X5 webview,虽然好用,但是在Fragment中传递消息困难,想要返回上一页,还得各种消息传递什么的,麻烦.可是在Fragment中又不能使用onKeyDown ...