Django使用表单操作数据库
| 前言 |
- 目标:实现Django通过表单的GET方式和POST方式提交数据,并添加到数据库 。
- OS:win10 x64
- Django:1.11.8
- Python: 3.6
- 本文完整示例:完整示例;
虽然使用的系统和软件没有什么影响,但还是交代一下。
| 二、实现思路 |
从用户角度考虑
- 访问一个url,返回填写表单页面;
- 在表单页面填写信息,并提交;
- 若提交成功,返回提交成功页面,并提供返回添加页面和图书列表跳转链接;
- 若提交失败,则返回操作失败页面,并提供跳转继续添加链接;
从开发者角度
- 用户请求一个url,传递一个页面给用户;
- 用户填写数据后提交,这时需要判断字段是否合法,合法则允许提交;不合法则提示哪一项不合法,提示用户修改;
- 用户提交成功后,修改数据库;若修改数据库等操作成功,则传递成功页面;否则,返回失败页面;
- 继续等待用户其他url请求。
| 三、实现步骤 |
接下来,将从开发者的角度实现。
假设有这样一个场景,图书管理员需要向数据库中录入书籍以及作者的信息,书籍只具有“书名“属性,作者具有"姓名" 和 "年龄"属性。
1. 用户访问url,传递一个页面给用户
- 在urls.py文件中添加路由
urlpatterns = [
# 以上还有很多url路由,这里仅列出需要的路由
## 利用表单增加图书,实现前台与数据库交互
url(r'^addbook/$', polls_views.addbook),
]
以上url匹配地址http://127.0.0.1/addbook/,当用户访问该地址时,返回一个页面给用户。
- 返回给用户页面bookadd.html
在views.py文件中添加方法,返回页面bookadd.html。
## 返回给用户页面bookadd.html
def addbook(request):
return render(request, 'bookadd.html')
在templates目录下新建bookadd.html文件,添加HTML代码。
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>增加图书</title>
<script src="../js/jquery-2.1.3.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
</style>
</head>
<body>
<h2>增加图书</h2>
<h3>GET方式</h3>
<form action="/addbooktodatabase/" method="get" name="addbook">
<p><span>书名:</span><input type="text" placeholder="书名" name="book_name"></p>
<p><span>作者:</span><input type="text" placeholder="作者" name="author"></p>
<p><span>作者年龄:</span><input type="text" placeholder="作者年龄" name="author_age"></p>
<input type="reset"> <input type="submit" value="增加">
</form>
<h3>POST方式</h3>
<form action="/addbooktodatabase/" method="post" name="addbook">
{% csrf_token %}
<p><span>书名:</span><input type="text" placeholder="书名" name="book_name"></p>
<p><span>作者:</span><input type="text" placeholder="作者" name="author"></p>
<p><span>作者年龄:</span><input type="text" placeholder="作者年龄" name="author_age"></p>
<input type="reset"> <input type="submit" value="增加">
</form>
</body>
</html>
显示效果如下:
- 在用户本地页面判断操作是否合法
使用JavaScript或JQuery实现判断,这个实现方法很多,不再赘述。
- 用户提交成功,后台传递给指定url,更新数据库
在urls.py文件中添加url路由
urlpatterns = [
# 以上还有很多url路由,这里仅列出需要的路由
## 处理表单提交的数据,实现前台与数据库交互
url(r'^addbooktodatabase/', polls_views.addbooktodatabase),
]
在views.py中增加更新数据库方法
# 向图书馆增加数据GET或POST方法方法
def addbooktodatabase(request):
# 获取参数book_name,author,author_age
if request.method == "GET":
book_name = request.GET["book_name"]
author_name = request.GET["author"]
author_age = request.GET["author_age"]
else:
book_name = request.POST["book_name"]
author_name = request.POST["author"]
author_age = request.POST["author_age"]
## 先增加作者信息
from polls.models import Person
person = Person()
person.name = author_name
person.age = author_age
person.save()
## 增加图书信息
from polls.models import Book
bookadded = Book(name=book_name)
# 保存修改
bookadded.person_id = person.id
bookadded.save()
# 重定向到添加成功页面
from django.http import HttpResponseRedirect
return HttpResponseRedirect('/addok/')
- 返回页面addok/html
在urls.py文件中添加url路由
urlpatterns = [
# 以上还有很多url路由,这里仅列出需要的路由
# 添加成功后返回添加成功页面addok
url(r'^addok/', polls_views.addok),
]
在templates目录下新建addok.html文件,添加HTML代码。
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加成功</title>
<style>
* {
margin: 0;
padding: 0;
}
a{
text-decoration:none;
}
</style>
</head>
<body>
<div>
<p>添加图书成功</p>
<p><a href="/addbook/">继续添加</a></p>
<p><a href="/booklist/">查看图书列表</a></p>
</div>
</body>
</html>
显示效果如下:
- 当用户点击“查看图书列表”时,传递bookList.html页面
bookList.html在另一篇博文中已实现,请参考:利用Django中的url方法实现地址动态拼接自动生成超链接地址
显示效果如下:
可以看到,图书“水浒传已经添加成功”。
| 四、总结 |
- 本文完整示例:完整示例;
- 能力有限,欢迎指错。
注意:
- 这里并没有实现页面的安全检测,可自行通过JS或JQuery实现;
- 在接收数据时,由于GET和POST方法取值不同,需要对GET和POST方法进行判定;
- 为了防止恶意SQL注入,对用户输入的内容字段也应该进行检测。
Django使用表单操作数据库的更多相关文章
- Django学习笔记之数据库-数据库与模型
MySQL数据库 在网站开发中,数据库是网站的重要组成部分.只有提供数据库,数据才能够动态的展示,而不是在网页中显示一个静态的页面.数据库有很多,比如有SQL Server.Oracle.Postgr ...
- python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...
- 循序渐进Python3(十二) --2-- web框架之django简单实现oracle数据库操作
在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接. 产能在软 ...
- Django开发笔记之数据库的设计
后台采用Django开发,可以体会到开发的便利之处,对于一个项目来说,首先最重要的是数据库的设计,那么在Django下数据库设计主要是如下步骤: 1,需求分析,这点子不用多说,而我也深刻体会到了没有原 ...
- Django 反向生成 从数据库生成Model
Django 反向生成 从数据库生成Model 使用Django生成Model python manage.py inspectdb或python manage.py inspectdb > m ...
- Scrapy中使用Django的Model访问数据库
Scrapy中使用Django的Model进行数据库访问 当已存在Django项目的时候,直接引入Django的Model来使用比较简单 # 使用以下语句添加Django项目的目录到path impo ...
- Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置
近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...
- Django视图,与数据库交互并返回数据
环境:python 2.7.13 数据库:sqlite3(Django自带) 在学习Django的时候,遇到了困难.大概就是取到数据库数据后一直不能转成json数据.最后终于自己琢磨解决了. 要点就 ...
- Django的ORM实现数据库事务操作
在Django中实现数据库的事务操作 在学习MySQL数据库时,MySQL数据库是支持原子操作的. 什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费. 交易正常时,银行在消费者 ...
随机推荐
- Java编程思想(十五) —— 类型信息之反射
讲完.class,Class之后,继续. 1)泛化的Class引用 Class也能够增加泛型,增加之后会进行类型检查. 贴一下书上原话,Class<?>优于Class,尽管他们是等价的,C ...
- python之函数用法vars()
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法vars() #vars() #说明:返回对象object的属性和属性值的字典对象 ' ...
- Python之L.pop()和del L[i]
# -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之L.pop()和del L[i] #http://python.jobbole.com/826 ...
- 通过Java发送邮件和接收邮件的工具类
一.第一种 使用SMTP协议发送电子邮件 第一步:加入mail.jar包 (1)简单类型 package com.souvc.mail; import java.util.Date; import j ...
- linux 使用wc命令统计文件行数、字数及大小
语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也给出所有指定文件的总统计数.字是由空格字符区分开的最大字符串. 该命令各选 ...
- Java开源内容管理CMS系统J4CMS集成到JTM
JTM是Win32下绿色免费的JDK + Tomcat + MySQL环境集成工具. 通过JTM用户无需对JDK.Tomcat.MySQL进行不论什么安装和配置就可以迅速搭建支持JSP + MySQL ...
- Nginx的HTTPS 301重定向到另一个TLD(托管在同一服务器上)没有显示出SSL警告
我自己 example.com, .com.au, .net, .net.au, ... (8 in total). 我想所有的这些顶级域名以301的域名重定向到安全.COM域 https://www ...
- Asp.Net中using的使用的方法(转)
摘自:http://blog.sina.com.cn/s/blog_6aa9c73801018ggw.html 一.强制资源整理(实用性非常强,希望大家多多使用,比try-catch-finaly效率 ...
- Java虚拟机学习 - JDK可视化监控工具 ( 7 )
1.JConsole JConsole工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定.双击其中一个jvm进程即可开始监控,也可使用“远程 ...
- 使用 HTML5 History 新特性增强 Ajax 的体验(转)
一. 场景再现 如大家熟知,Ajax 可以实现页面的无刷新操作,但会造成两个与普通页面操作(有刷新地改变页面)有着明显差别的问题—— URL 没有修改以及无法使用前进.后退按钮.例如常见的 Ajax ...