有时候我们需要在前台用 get 或 post 方法提交一些数据,所以需要用到 html 表单的知识。
1、创建项目,选择File–>New project–>Django
①根据个人需要,选择相关设置:
②同时创建app
2、查看settings.py文件,会发现app的注册和templates文件夹的路径都已经配置好了。比我们使用命令行创建的较方便一点。
3、在urls.py写入如下路由
4、比如我们需要写一个计算 a和 b 之和的简单应用,网页中应该这么写。在templates文件夹下新建一个index.html的文件。并写入如下代码:
这里我们定义了一个form表单,action指向了提交的地址。同时设置了两个输入框,请求类型是get请求,以及一个提交按钮。
{% url 'form' %}表示引用name="form"的路由地址,上一篇文章已经讲到。
5、编写业务逻辑,
def index(request):
return render(request, template_name='index.html')
def form(request):
'''
计算form表单中a和b相加之后的值。
:param request:
:return:
'''
a = request.GET.get('a','')
b = request.GET.get('b', '')
return HttpResponse('结果是:{}'.format(int(a) + int(b)))
网页的值传到服务器是通过 标签中的 name 属性来传递的。
在服务器端这么接收:a = request.GET.get(‘a’, ‘’)
request.GET 可以看成一个字典,用GET方法传递的值都会保存到其中,可以用 request.GET.get(‘a’, ‘’)来取值,没有时设置一个默认值,这样不会不报错。
6、访问index首页,其页面效果是这样的
此时我们输入两个数,点击计算按钮,
点击了计算,数据提交到form/这个路由进行运算,得出结果
从上图我们可以观察到,此时的url是# 此时的url地址:form/?a=5&b=3,说明form表单的get请求地址也是通过?&进行连接的。
7、细心额同学就会发现比如我们输入的不是数字,而是字母,就会报错了。
8、Django为我们考虑到了这些问题。
Django框架的form表单,除了提供基本的请求,还提供了一套用于验证input中填写的数据是否合法。比如:要求填写的数字,但是填写的是字母,就会被django中的form的验证机制识别为数据不合法。数据是否合法指的是form预先设定的类型或者是数据长度是否和输入的数据类型和长度保持一致。
①、要使用django框架的表单,首先我们需要在formtest这个app下创建一个forms.py文件。在这个文件中,可以实现form表单的定制。
注意:forms.py文件名是固定的,不能修改。
②编写代码
from django import forms
class CustomForm(forms.Form):
a=forms.IntegerField()
b=forms.IntegerField()
③ 修改我们的views.py文件,当加载到form表单时,需要将我们定制的CustomForm这个表单,渲染到index.html中。
from .forms import CustomForm
def index(request):
form = CustomForm() #实例化类的对象
return render(request, template_name='index.html', context={'form': form})
④、修改index.html的内容
⑤、刷新显示
细心的童鞋就会发现,只有两个input输入框。没有form表单,以及提交按钮。
注意:
a、form标签和button按钮还需要自己去设置。
b、自定义表单只生成input标签 。
对此我们再对index.html稍作修改:
刷新查看:
这就构成了我们想要的form表单结构。对比之前我们写的form表单,发现django生成的form表单多出了一个label标签。那么这个label是干什么的呢?
注意:
一般label和input都是成对出现的。
label主要起到了定位光标的作用(即点击A会定位到A的输入框)。
label中的for属性需要设置为input标签的id属性值。
⑥此时在填写a和b时,发现不能填写英文字符了,只能输入数字了。
并且不填写时会提示请填写此字段(这个是受到required的限制,其默认值是true)。
9、上面演示了使用get请求提交表单,那么如果表单(CustomForm)是post请求,如何获取参数呢?
①、再次修改index.html文件。添加一个post请求提交的表单。
②、修改业务逻辑。
def form(request):
'''
计算form表单中a和b相加之后的值。
:param request:
:return:
'''
if request.method=='GET':
a = request.GET.get('a','')
b = request.GET.get('b', '')
return HttpResponse('结果是:{}'.format(int(a) + int(b)))
elif request.method=='POST':
form = CustomForm(data=request.POST)
if form.is_valid():
a=form.cleaned_data['a']
b=form.cleaned_data['b']
return HttpResponse(a+b)
注释:
form = CustomForm(data=request.POST) # 根据post请求的数据,初始化CustomForm这个表单
#cleaned_data:如果CustomForm表单数据是合法的,那么input标签中的值,都会被放入cleaned_data这个字典中,如果CustomForm表单数据是不合法的,那么cleaned_data字典就不存在。
#在使用cleaned_data之前,一定要通过is_valid()判断数据的合法性,否则cleaned_data这个字典就是不存在的。只有通过is_valid()验证之后,才会生成这个cleaned_data这个字典。
③填写数据
④刷新查看
a、此时会报出一个错误,原因是我们没有添加csrf_token这个标签。
b、csrf_token:主要是为了防止一些跨站请求伪造攻击。
c、每次在刷新页面的时候,django的中间件csrf会动态生成一个隐藏的input,它的value是一个随机字符串,加载到页面源代码里,同时django框架会将这一次生成的随机字符串保存在自己的数据库中。
d、 等form表单发送post请求时,除了表单数据以外,浏览器会自动将这个隐藏的input标签的值也携带上,提交给django后台,django的中间件就会对这个加密的随机字符串和数据库中的进行对比,如果一致,说明是正常的请求,如果不一致,django就会出现403拒绝请求的页面,认为是一个非法的请求。
⑤修改index.html文件,添加csrf_token标签。
⑥再次运行
10、表单的学习就告一段落了。同时也提出了以下问题,望读者思考。
1、同一个视图函数如何处理同一个请求?
2、同一个视图函数如何处理不同的请求?
我们将在下文来解答这个问题。