小白学习django第五站-简易案例
首先在setting.py文件中编写数据库配置内容
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'site',
'USER': 'user',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '',
}
}
之后在app中models.py文件编写模型映射表
from django.db import models # Create your models here. class BlogModle2(models.Model):
title = models.CharField(max_length=50) # 标题
content = models.TextField() # 内容 def __str__(self):
return f'title={self.title}, content={self.content}'
通过pycham的控制台输入
makemigrations appname
migrate appname
创建数据库中的表
之后进行模版渲染,在app中views.py中编写index, add, list, detail, edit这五个函数
index
from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse
from .models import BlogModle2
# Create your views here. def blog_index(request): # 主页函数
return render(request, 'blog/demo_index.html') # 渲染index页面
{% extends 'blog/demo_base.html' %}
{% block title %}
首页
{% endblock %}
{% block bodyblock %}
<tr>
<td><a href="{% url 'blog_add' %}">添加文章</a></td>
<td><a href="{% url 'blog_list' %}">文章列表</a></td>
</tr>
{% endblock %}
add
def blog_add(request): # 添加页面
if request.method == 'GET': # 如果请求为get请求
return render(request, 'blog/demo_add.html') # 渲染 add 页面
elif request.method == 'POST': # 如果请求为post页面
title = request.POST.get('title') # 获取form表单填写的标题
content = request.POST.get('content') # 获取form表单填写的内容
blog = BlogModle2(title=title, content=content) # 数据库写入
blog.save()
return render(request, 'blog/demo_add.html') # 渲染add页面
{% extends 'blog/demo_base.html' %}
{% block title %}
添加博客
{% endblock %}
{% block bodyblock %}
<h1>添加新文章</h1>
<form action="" method="POST">
{% csrf_token %} {# 防止跨域攻击与请求 #}
{# <form action="" method="GET"> {% 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.content }}</textarea>
<button type="submit">发布博客</button>
</form>
{% endblock %}
list
def blog_list(request): # 列表页面
blog_list = BlogModle2.objects.all() # 获取数据库表中所有内容
return render(request, 'blog/demo_list.html', context={'blog_list': blog_list}) # 传递blog_list内容,渲染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>
<th><a href="{% url 'blog_edit' blog.id %}">编辑</a> | <a href="{% url 'blog_delete' blog.id %}">删除 </a></th>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
detail
def blog_detail(request, blog_id): # 详情页面
blog = BlogModle2.objects.get(id=blog_id) # 获取选中数据库表中标题那条数据
return render(request, 'blog/demo_detail.html', context={'blog': blog}) # 渲染detail页面
{% extends 'blog/demo_base.html' %}
{% block title %}
文章详情
{% endblock %}
{% block bodyblock %}
<h1>{{ blog.title }}</h1>
{{ blog.content }}
{% endblock %}
delete
def blog_delete(request, blog_id): # 删除功能
blog = BlogModle2.objects.get(id=blog_id) # 获取选中数据库表中标题那条数据
if blog: # 如果存在
blog.delete() # 删除
return redirect(reverse('blog_list')) # 返回列表页面
else:
return HttpResponse('不存在这条博客')
edit
def blog_edit(request, blog_id): # 编辑
blog = BlogModle2.objects.get(id=blog_id) # 获取选中数据库中数据
if request.method == 'GET': # 如果是GET请求
return render(request, 'blog/demo_add.html', context={'blog': blog}) # 渲染add页面,自动填入获取内容
elif request.method == 'POST': # 如果是post请求
blog.title = request.POST.get('title') # 标题修改
blog.content = request.POST.get('content') # 内容修改
blog.save()
return redirect(reverse('blog_list')) # 重定向到list页面
urls.py
from django.urls import path, re_path
from . import views urlpatterns = [
path('index/', views.blog_index, name='blog_index'),
path('add/', views.blog_add, name='blog_add'),
path('list/', views.blog_list, name='blog_list'),
path('detail/<blog_id>', views.blog_detail, name='blog_detail'),
path('delete/<blog_id>', views.blog_delete, name='blog_delete'),
path('edit/<blog_id>', views.blog_edit, name='blog_edit'),
]
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} {% endblock %}</title>
</head>
<body>
{% block bodyblock %} {% endblock %} </body>
</html>
小白学习django第五站-简易案例的更多相关文章
- 小白学习django第六站-http相关
请求与相应 HttpRequest对象API def home(request): print('path:', request.path) print('mothod:', request.meth ...
- 小白学习django第四站-关联数据库
使用mysql连接django首先要配置好相关环境 首先在setting.py配置数据库信息(需要现在mysql中创建一个数据库) 在setting.py那个目录的__init__.py文件中写入 之 ...
- 小白学习django第三站-自定义过滤器及标签
要使用自定义过滤器和标签,首先要设置好目录结构 现在项目目录下建立common的python包 再将common加入到setting.py中的INSTALLED_APP列表中 在common创建目录t ...
- 小白学习django第一站-环境配置
Django简单来说就是用Python开发的一个免费开源的Web框架 使用Django,使你能够以最小的代价构建和维护高质量的Web应用. 开搞!!! 工具准备: linux(ubuntu) + py ...
- 小白学习django第二站-模版配置
上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...
- 小白学习Spark系列五:scala解析多级json格式字符串
一.背景 处理json格式的字符串,key值一定为String类型,但value不确定是什么类型,也可能嵌套json字符串,以下是使用 JSON.parseFull 来解析多层json. 二.实例代码 ...
- 小白学习tornado框架第一站-环境设置
首先建立一个虚拟环境 mkvirtualenv -p /usr/bin/python3 tornado_1 安装tornado框架 pip install tornado pycham中建立同步 创 ...
- 小白学习vue第五天-第二弹(全局局部、父子、注册语法糖,script/template抽离模板)
全局组件: 就是注册的位置在实例对象的外面 并且可以多个实例对象使用 而局部: 就是在实例对象的内部注册 父组件和子组件的关系 子组件就是在另一个组件里面注册的组件 组件注册语法糖: 就不用Vue.e ...
- 小白学习vue第五天(理解使用组件开发,组件第一弹)
组件怎么从创建到使用? 第一步创建组件构造器对象 感觉个人理解就是创建一个模板,和创建MongoDB数据模板相似 const cpnC = Vue.extend({ template: ` <d ...
随机推荐
- Maven-项目管理(一)_认识Maven
Maven是什么? Maven是Apache下的项目管理工具,它由纯Java语言开发,可以帮助我们更方便的管理和构建Java项目. 为什么要使用Maven? 1. jar包管理: a) 从Maven中 ...
- C++入门经典-例8.5-多重继承
1:C++允许子类从多个父类继承公有的和受保护的成员,这称为多重继承. 2:多重继承的定义.多重继承有多个基类名称标识符,其声明形式如下: class 派生类名标识符:[继承方式] 基类名标识符1,. ...
- 石川es6课程---11、json
石川es6课程---11.json 一.总结 一句话总结: ` 感觉更方便了一点,增加了一些简写 ` key-value 一样时可以简写:console.log({ a,b}}) ` 里面函数可以简写 ...
- Java程序如何限速(控制下载和上传速度)
转自 http://www.blogjava.net/canvas/articles/bandwidthlimiter.html 这里简单的讨论一下java设计网络程序中如何控制上传和下载速度,我们常 ...
- T89359 扫雷
T89359 扫雷 题解 朴素做法:暴力出奇迹 一维数组按道理不能开到1e7这么大吧,但是我开了井然 A 了 或许是rp问题 #include<iostream> #include< ...
- C# 防火墙操作之开启与关闭
通过代码操作防火墙的方式有两种:一是代码操作修改注册表启用或关闭防火墙:二是直接操作防火墙对象来启用或关闭防火墙.不论哪一种方式,都需要使用管理员权限,所以操作前需要判断程序是否具有管理员权限. 1. ...
- 最长公共子子串 java
package maxCommon; /** * 找到最长公共子串 * @author root */ public class MaxCommonUnSeries { public static v ...
- Android百分比支持布局库的使用和源码分析
Android-percent-support这个库 描述下这个support-lib. 这个库提供了: 两种布局供大家使用: PercentRelativeLayout.PercentFrameLa ...
- vs install 安装时自动添加注册表
思路:使用自定义 解决方案添加类库项目 添加安装程序类 随后右键查看代码 在构造函数添加事件 同时完成这个事件,在此事件中根据需要添加我们需要的内容,此处为添加注册表,并根据安装目录添加url pro ...
- 使用 QQ 邮箱发送邮件报错:java.net.SocketTimeoutException: Read timed out. Failed messages: javax.mail.MessagingException: Exception reading response
使用 QQ 邮箱发送邮件报错:java.net.SocketTimeoutException: Read timed out. Failed messages: javax.mail.Messagin ...