• 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注入,对用户输入的内容字段也应该进行检测。
  • 相关阅读:
    and &&区别
    redis服务意外停止
    shell基础之bash
    vbox的桥接网络
    apache安装及相应配置
    https服务器配置部署
    nginx + php + mysql安装、配置、自启动+redis扩展
    VirtualBox安装linux
    本地检出远程分支
    linux下的crontab安装及简单使用
  • 原文地址:https://www.cnblogs.com/waltsmith/p/8094441.html
Copyright © 2020-2023  润新知