zoukankan      html  css  js  c++  java
  • 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注入,对用户输入的内容字段也应该进行检测。
  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/waltsmith/p/8094441.html
Copyright © 2011-2022 走看看