zoukankan      html  css  js  c++  java
  • Django基础学习笔记(四)

    在上一篇的末尾介绍了关于Django的视图部分以及请求对象和响应对象的概念。
    这里就趁热打铁的介绍一下,网站的经典交互方式:HTML表单。

    HTML表单(HTTP请求)

    HTTP协议以"请求-回复"的方式工作。客户发送请求时,可以在请求中附加数据。服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务。

    GET方法

    这里的参数就会和html的input标签中name字段相关(之前验证浏览器存储账号和密码时也是根据此字段进行存储的),由于urls.py仅负责进行路由,这里不再分析展示。
    对应的表单search_form.html模板(templates)文件如下所示:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
        <form action="/search/" method="get">
            <input type="text" name="q"> 
    	<!--这里的q被用于GET方法的字段识别-->
            <input type="submit" value="搜索">
        </form>
    </body>
    </html>
    

    这里建立一个与views平行的search.py用于处理表单,代码如下所示:

    from django.http import HttpResponse
    from django.shortcuts import render
    # 表单(访问方法search.search_form)
    def search_form(request):
        return render(request, 'search_form.html')
     
    # 接收请求数据
    def search(request):  
        request.encoding='utf-8'
        if 'q' in request.GET and request.GET['q']:
            message = '你搜索的内容为: ' + request.GET['q']
        else:
            message = '你提交了空表单'
        return HttpResponse(message)
    

    POST方法

    对应的表单post.html模板(templates)文件如下所示:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
        <form action="/search-post/" method="post">
            {% csrf_token %}
            <input type="text" name="q">
            <input type="submit" value="搜索">
        </form>
     
        <p>{{ rlt }}</p>
    </body>
    </html>
    

    具体调用方法以及实现机制同上,建立与views.py平行的search2.py,代码如下所示:

    # -*- coding: utf-8 -*-
     
    from django.shortcuts import render
    from django.views.decorators import csrf
     
    # 接收POST请求数据
    def search_post(request):
        ctx ={}
        if request.POST:
            ctx['rlt'] = request.POST['q']
        return render(request, "post.html", ctx)
    

    值得一提的是,要注意一下urls.py中的import部分,进行上述操作后该部分的代码为:

    from django.conf.urls import url
    from . import views,testdb,search,search2
    

    Request对象

    这部分类似于最开始介绍的Hello World,类似的实现代码如下所示:

    from django.http import HttpResponse
    
    def runoob(request):
        return HttpResponse("Hello world")
    

    QueryDict对象

    数据库操作

    可以通过Navicat在已连接的数据库中建立数据表,表名要与函数名对应:表名组成结构为:应用名_类名(如:TestModel_test)。
    或者使用如下命令创建对应APP模块函数中用到的数据表(即要先在对应APP模块中models.py写好操作数据库的函数代码):

    python manage.py migrate   # 创建表结构
    
    python manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更
    python manage.py migrate TestModel   # 创建表结构
    

    其中,models.py的代码如下所示:

    # models.py
    from django.db import models
     
    class Test(models.Model):
        name = models.CharField(max_length=20) #自动生成的表将包括除id字段(Key)之外的name字段
    

    添加数据

    正如前文连接数据库提到的,之后若想添加数据只需要如下代码,save即添加数据后保存(此部分均需要在urls.py中的import部分加入对应的内容):

    # -*- coding: utf-8 -*-
     
    from django.http import HttpResponse
     
    from TestModel.models import Test
     
    # 数据库操作
    def testdb(request):
        test1 = Test(name='runoob')
        test1.save()
        return HttpResponse("<p>数据添加成功!</p>")
    

    获取数据

    这部分比较简单粗暴,直接上代码:

    # -*- coding: utf-8 -*-
     
    from django.http import HttpResponse
     
    from TestModel.models import Test
     
    # 数据库操作
    def testdb(request):
        # 初始化
        response = ""
        response1 = ""
        
        
        # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
        list = Test.objects.all()
            
        # filter相当于SQL中的WHERE,可设置条件过滤结果
        response2 = Test.objects.filter(id=1) 
        
        # 获取单个对象
        response3 = Test.objects.get(id=1) 
        
        # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
        Test.objects.order_by('name')[0:2]
        
        #数据排序
        Test.objects.order_by("id")
        
        # 上面的方法可以连锁使用
        Test.objects.filter(name="runoob").order_by("id")
        
        # 输出所有数据
        for var in list:
            response1 += var.name + " "
        response = response1
        return HttpResponse("<p>" + response + "</p>")
    

    更新数据

    # -*- coding: utf-8 -*-
     
    from django.http import HttpResponse
     
    from TestModel.models import Test
     
    # 数据库操作
    def testdb(request):
        # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
        test1 = Test.objects.get(id=1)
        test1.name = 'Google'
        test1.save()
        
        # 另外一种方式
        #Test.objects.filter(id=1).update(name='Google')
        
        # 修改所有的列
        # Test.objects.all().update(name='Google')
        
        return HttpResponse("<p>修改成功</p>")
    

    删除数据

    # -*- coding: utf-8 -*-
     
    from django.http import HttpResponse
     
    from TestModel.models import Test
     
    # 数据库操作
    def testdb(request):
        # 删除id=1的数据
        test1 = Test.objects.get(id=1)
        test1.delete()
        
        # 另外一种方式
        # Test.objects.filter(id=1).delete()
        
        # 删除所有数据
        # Test.objects.all().delete()
        
        return HttpResponse("<p>删除成功</p>")
    
  • 相关阅读:
    Installshield 添加应用程序到防火墙例外
    服务器表导入到本地数据库SQL语句
    【转】13个JavaScript图表(JS图表)图形绘制插件
    【转】20个简化开发任务的 JavaScript库
    【转】8 个效果惊人的 WebGL/JavaScript 演示
    【转】JavaScript 3D图表
    VMware显示错误:“未能锁定文件 无法打开磁盘 ..*.vmdk 或者某一个快照所依赖的磁盘。”解决办法
    Spring HTTP invoker简介
    【转】在Ubuntu下建立Eclipse的Android开发环境
    【转】在NetBeans上搭建Android SDK环境
  • 原文地址:https://www.cnblogs.com/Jesse-Cavendish/p/14778058.html
Copyright © 2011-2022 走看看