Django使用表单操作数据库

前言
  1. 目标:实现Django通过表单的GET方式和POST方式提交数据,并添加到数据库 。
  2. OS:win10 x64
  3. Django:1.11.8
  4. Python: 3.6
  5. 本文完整示例:完整示例;

虽然使用的系统和软件没有什么影响,但还是交代一下。

二、实现思路
  • 从用户角度考虑

    1. 访问一个url,返回填写表单页面;
    2. 在表单页面填写信息,并提交;
    3. 若提交成功,返回提交成功页面,并提供返回添加页面和图书列表跳转链接;
    4. 若提交失败,则返回操作失败页面,并提供跳转继续添加链接;
  • 从开发者角度
    1. 用户请求一个url,传递一个页面给用户;
    2. 用户填写数据后提交,这时需要判断字段是否合法,合法则允许提交;不合法则提示哪一项不合法,提示用户修改;
    3. 用户提交成功后,修改数据库;若修改数据库等操作成功,则传递成功页面;否则,返回失败页面;
    4. 继续等待用户其他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">&nbsp;&nbsp;&nbsp;&nbsp;<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">&nbsp;&nbsp;&nbsp;&nbsp;<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方法实现地址动态拼接自动生成超链接地址

显示效果如下:

可以看到,图书“水浒传已经添加成功”。

四、总结
  1. 本文完整示例:完整示例;
  2. 能力有限,欢迎指错。

注意:

  1. 这里并没有实现页面的安全检测,可自行通过JS或JQuery实现;
  2. 在接收数据时,由于GET和POST方法取值不同,需要对GET和POST方法进行判定;
  3. 为了防止恶意SQL注入,对用户输入的内容字段也应该进行检测。
时间: 2024-10-13 16:17:56

Django使用表单操作数据库的相关文章

Django 反向生成 从数据库生成Model

Django 反向生成 从数据库生成Model 使用Django生成Model python manage.py inspectdb或python manage.py inspectdb > models.py 就可以生成了自动产生Django model

Django开发笔记之数据库的设计

后台采用Django开发,可以体会到开发的便利之处,对于一个项目来说,首先最重要的是数据库的设计,那么在Django下数据库设计主要是如下步骤: 1,需求分析,这点子不用多说,而我也深刻体会到了没有原型的时候就开始开发的困难之处,每次需求更改就会带来后台的数据和对应接口的一次变更.费时费精力 2.有了需求,那么开始数据库的设计,在Django中,并不需要直接去操作数据库,而且使用继承modesl.Model的类,在类中定义自己的模型,然后使用Python manage.py syncdb就可看到

表单操作-复选框

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表单操作-复选框</title> <style> *{margin:0; padding: 0;} li{list-style: none;} .clearfix:before,.clearfix:after{display: table; co

Django视图,与数据库交互并返回数据

环境:python 2.7.13  数据库:sqlite3(Django自带) 在学习Django的时候,遇到了困难.大概就是取到数据库数据后一直不能转成json数据.最后终于自己琢磨解决了. 要点就是在通过Django API与sqlite数据库做交互时,要看清楚返回的对象是什么类型. 首先,与数据库做交互,简单来说,无非就是增删改查.首先来说一说"查",以后会陆续更新其他 查 在网上查了几种比较常用的方法 models.UserInfo.objects.all() models.U

VB6-操作数据库

平常搞数据库操作多了就想把经常用的内容放在一起,我也懒,在一本书里的工程例子挑了一个bas,修修改改,凑合这用吧. 1 Public strCnn As String '数据库连接字符串 2 Public AdoCnn As ADODB.Connection '数据库连接 3 Public IsConnect As Boolean '判断是否连接 4 5 6 Private Sub Connect() '连接数据库 7 On Error GoTo Err: 8 If IsConnect = Tr

python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用. 本节的代码:(Django 1.6, Python 2.7 测试环境) 大

使用Access作数据库

1 import java.sql.*; 2 3 public class ConnectAccess { 4 5 6 public static void main(String args[]){ 7 ConnectAccess ca = new ConnectAccess(); 8 try { 9 ca.connectAccess(); 10 } catch (Exception e) { 11 e.printStackTrace(); 12 } 13 } 14 15 public void

表单操作集合类.

/** * @class FormOperation 表单操作方法集合类 * @constructor */ function FormOperation(){ var TIP_CLASS_NAME = "tip-messages"; //消息显示框类 var TIP_SHOW_TIME = 5000; //消息框显示时间 /** * 检测必须字段 * @param{String} className 类名 * @param{Boolean} showTip 是否显示提示框,默认tru

Django——连接sql server数据库

Django——连接sql server数据库 *在此注明,本人使用的是python3.5和Django2.0.4 sql server是微软出的一款闭源的可运行于windows和linux平台上的关系型数据库.由于其闭源的特性,所以较少有公司使用,但是比较神奇的是,我所在的公司和我几个朋友所在的公司业务都是以爬虫为主,都是以sql server作为主要的数据库在使用. 一.打包 如果你是使用Django的老手应该知道Django默认不支持sql server:如果你刚开始接触Django,那么