Django 表单
HTML表单是网站交互性的经典方式。
1 HTTP 请求
HTTP协议以"请求-回复"的方式工作。客户发送请求时,可以在请求中附加数据。服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务。
1.1 GET 方法
我们在之前的HelloWorld项目中(里面的一个)创建一个 search.py 文件,用于接收用户的请求:
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render
#表单
def search_form(request):
return render(request,'search_form.html')
#接收请求数据
def search(request):
request.encoding = 'utf-8'
if 'q' in request.GET:
message = u'你搜索的内容为: ' + request.GET['q']
else:
message = u'你提交了空表单'
return HttpResponse(message)
在模板目录template中添加 search_form.html 表单:
<html>
<head>
<meta charset="utf-8" />
<title>Search-w3cschool.cn</title>
</head>
<body>
<form action="/search/" method="get">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
</body>
</html>
urls.py 规则修改为如下形式:
from django.urls import path
from . import views,testdb,search,search2
urlpatterns = [
path('hello/',views.hello,name='hello'),
path('testdb/',testdb.testdb,name='testdb'),
path('search/',search.search),
path('search_form/',search.search_form),
]
启动项目,访问地址:http://localhost:8000/search-form/并搜索,结果如下所示:
1.2 POST 方法
上面我们使用了GET方法。视图显示和请求处理分成两个函数处理。
提交数据时更常用POST方法。我们下面使用该方法,并用一个URL和处理函数,同时显示视图和处理请求。
我们在tmplate 创建 post.html:
<html>
<head>
<meta charset="utf-8" />
<title>Search-w3cschool.cn</title>
</head>
<body>
<form action="/search_post/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Search">
</form>
<p>{{ rlt }}</p>
</body>
</html>
在模板的末尾,我们增加一个rlt记号,为表格处理结果预留位置。
表格后面还有一个{% csrf_token %}的标签。csrf全称是Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。POST方法提交的表格,必须有此标签。
在HelloWorld目录下新建 search2.py 文件并使用 search_post 函数来处理 POST 请求:
# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.template.context_processors import csrf
# 接收post请求数据
def search_post(request):
ctx = {}
ctx.update(csrf(request))
if request.POST:
ctx['rlt'] = request.POST['q']
return render(request,"post_form.html",ctx)
urls.py 规则修改为如下形式:
from django.urls import path
from . import views,testdb,search,search2
urlpatterns = [
path('hello/',views.hello,name='hello'),
path('testdb/',testdb.testdb,name='testdb'),
path('search/',search.search),
path('search_form/',search.search_form),
path('search_post/',search2.search_post),
]
启动项目,访问地址:http://localhost:8000/search-post/并搜索,结果如下所示: