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的代码逻辑处理分为: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>
效果如下:
~~ 以上 ~~