7、第十 - WEB开发进阶 - Django数据获取上报操作

   Django 处理HTML页面表单数据上报,常见的类型有:input标签中文本类型及密码类型;单项框radio 类型;多项选择 checkbo类型;处理select 标签中单选或多选的数据;处理上传的文件。

一、Django获取一个及多个数据并展示

  示范案例:

  要求:获取用户提交的用户名及密码进行匹配,匹配成功进入页面跳转欢迎页面。(处理表单上传的单项、多项数据)
  主页面:login.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/login" method="post">
        #提交登录信息
        <P> 
            <a><input type="text" name="user" placeholder="用户名"></a>
            <a><input type="password" name="pwd" placeholder="密码"></a>
            <a><input type="submit" value="提交"></a>
        </P>

        #单选框
        <p> 
            男:<input type="radio" name="gender" value="1" />
            女:<input type="radio" name="gender" value="2"/>
        </p>

        #多项选择
        <p>爱好:
            足球<input type="checkbox" name="m_selection" value="11" />
            唱歌<input type="checkbox" name="m_selection" value="22"/>
            爬山<input type="checkbox" name="m_selection" value="22"/>
        </p>

        #select标签单项选择
        <p>
            <select name="city_1">
                <option  value="bj">北京</option>
                <option  value="sh">上海</option>
                <option  value="gz">广州</option>
                <option  value="sz">深圳</option>
            </select>
        </p>

        #select标签多项选择
        <p>
            <select name="city_2" multiple>
                <option  value="CQ">重庆</option>
                <option  value="HZ">杭州</option>
                <option  value="ZH">珠海</option>
                <option  value="CS">长沙</option>
            </select>
        </p>
    </form>
</body>
</html>

views.py 逻辑处理方法:

from django.shortcuts import render,redirect
from django.shortcuts import HttpResponse

def index(request):
    return HttpResponse('welcome')

def login(requeset):
    if requeset.method == "GET":
        return render(requeset,'login.html')
    elif requeset.method == "POST":
        u = requeset.POST.get('user')
        p = requeset.POST.get('pwd')

        #获取radio标签单项选择post数据
        gender = requeset.POST.get('gender')
        print(gender)
        
        #获取CheckBox标签多项选择的post数据,用requeset.POST.get只能获取一个,对数据不不完整。
        hobby_1 = requeset.POST.get("m_selection")
        print(hobby_1)

        #获取CheckBox标签多项选择的post数据,用requeset.POST.getlist 列表的形式获取数据
        hobby_2 = requeset.POST.getlist("m_selection")
        print(hobby_2)

        city1 = requeset.POST.get("city_1")
        print(city1)

        city2 = requeset.POST.getlist("city_2")
        print(city2)

        if u == "root" and p == "chen1203":

            return redirect('/index')
        else:
            return render(requeset,'login.html')
    else:
        return redirect('/index')

 urls.py URL对应的映射:

from django.contrib import admin
from django.urls import path
from docker import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'index',views.index),
    path(r'login',views.login),
]

总结:在处理数据上传时,单项数据获取:requeset.POST.get;多项数据获取:requeset.POST.getlist;具体使用那种方式,要取决于上数据上报的类型。

二、Django获取上传的文件

  示范案例

  要求:获取上传的文件:处理上传的文件,无非就是两种数据 -- -- 获取文件名字;处理文件内容进行打印。

简单的处理逻辑:上传文件时,form 表单要做特殊的设置,添加:enctype="multipart/form-data",html 代码如下:

<body>
    <form action="/login" method="post" enctype="multipart/form-data">
        <p>
            <input type="file" name="FilesWord" />
        </p>
        <p>
            <input type='submit' value="确认提交"/>
        </p>
    </form>
</body>

 views.py 逻辑处理

from django.shortcuts import render,redirect
from django.shortcuts import HttpResponse
import os

def index(request):
    return HttpResponse('welcome')

def login(requeset):
    if requeset.method == "GET":
        return render(requeset,'login.html')
    elif requeset.method == "POST":
      
        #获取上传的文件数据,并读到内存中
        data = requeset.FILES.get("FilesWord")
        print(data,type(data),data.name)  

        #处理文件内容
        file_path = os.path.join('upload',data.name)
        f = open(file_path,mode="wb")
        for i in data.chunks():
            f.write(i)
        f.close()

    else:
        return redirect('/index')

 url 映射处理:

from django.contrib import admin
from django.urls import path
from docker import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'index',views.index),
    path(r'login',views.login),
]
三、Django的CBV和FBV框架

Django的代码逻辑处理分为:FBV 与 CBV 两种

  • 基于def函数处理模式:funcation base views  
  • 基于类(面向对象)的模式:class base views

  其实就是简单来讲,就是在viws逻辑处理的时候,是使用def函数调用,还是使用class(类)处理的。前面讲到的都是用函数处理的方式,下面模拟一下基于class的处理。(原则上讲 逻辑处理的脚本文件,更适合两种CBV\FBV 两种一起使用)。

views.py 逻辑处理的方法:使用 dispatch 的方法。进行路由分发,代码如下:

路由的分发规则是:以get类型为例

执行get请求:会调用Home的类,python 代码自上而下执行,先找到了 dispatch 函数。执行第一个print(before) ,接着判断请求的类型,跳转到get函数上执行完成后。在返回dispatch进行下面的函数。

流程如下:Home(View)--> dispatch() --> get(self,requeset) --> dispatch()
from django.shortcuts import render,redirect
from django.shortcuts import HttpResponse
from django.views import View

class Home(View): #View是一个固定的配置参数
    def dispatch(self, request, *args, **kwargs): #调用父类中的dispatch,相当于路由分开发
        print("before")
        result = super(Home,self).dispatch(request,*args,**kwargs)
        print("after")
        return result

    def get(self,requeset): #get函数名是已经被定义好,不随意更改
        print(requeset.method)
        #return HttpResponse("chen123")
        return render(requeset,'1.html')

    def post(self,request):#post函数名是已经被定义好,不随意更改
        print(request.method)
        return render(request,'1.html')

 urls.py 映射关系对接:

from django.contrib import admin
from django.urls import path
from docker import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'home',views.Home.as_view()), #views类
]

1.html 模板 如下:

<body>
    <form action="/home" method="post" >
        <input type="text" name="user" />
        <input type="submit" value="提交"/>
    </form>
</body>

效果:执行顺序流程,日志打印如下

before
GET
after
[14/Nov/2018 11:28:02] "GET /home HTTP/1.1" 200 263
before
POST
after
[14/Nov/2018 11:28:08] "POST /home HTTP/1.1" 200 263

 结论::这就简单的django路由分发模型

四、Django模板语言如何循环字典

   Django 进行web开发的时候,需要循环处理字典的数据。通常应用在读取数据库,形成数据进行展示。过程如下:

项目路由 urls.py 定义:

from django.contrib import admin
from django.urls import path
from docker import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'index/',views.index),

在项目的views.py 定义字典及处理方式:

from django.shortcuts import render,redirect
from django.shortcuts import HttpResponse
from django.views import View

#定义字典
user_dict = {
    1:{'k1':'v1'},
    2:{'k2':'v2'},
    3:{'k3':'v3'},
    4:{'k4':'v4'},
}

#处理方法
def index(request):
    return render(request,'2.html',{'user_dict':user_dict}) 

处理数据的模板语言 2.html的定义:

<body>
    {{ user_dict.k1 }}
    <ul>
        {% for  k in user_dict.keys %}  循环打印key 
            <li>{{ k }}</li>
        {% endfor %}
    </ul>
    <ul>
        {% for row in user_dict.values %} 循环打印values
            <li>{{ row }}</li>
        {% endfor %}
    </ul>
    <ul>
        {% for  k,row in user_dict.items %}  循环打印key\values
            <li>{{ k }}-{{ row }}</li>
        {% endfor %}
    </ul>

</body> 

效果如下:

  

~~ 以上 ~~

转载于:https://www.cnblogs.com/chen170615/p/9930769.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值