Django
中的表单丰富了传统的HTML
语言中的表单。在Django
中的表单,主要做以下两件事:
- 渲染表单模板。(不常用,容易前后端耦合)
- 表单验证数据是否合法。
Django中表单使用流程
在一个app中新建一个forms.py
,定义一个表单类,继承自django.forms.Form
。
Field字段名称在html中对应的是<input type="text" name="field_name" >
中input标签的name属性
比如title字段在html中就是<input type="text" name="title">
from django import forms
class FormTable(forms.Form):
# label是渲染字段的名称(默认是变量名),error_messages的键值对是{"'code'对应的值": "你想要显示的内容"}
title = forms.CharField(min_length=5, max_length=100, label="标题",
error_messages={"min_length": "字符至少5个,至多100个"})
content = forms.CharField(widget=forms.Textarea, label="内容",
error_messages={"required": "要有content内容"})
email = forms.EmailField(label="邮箱", error_messages={"required": "必须是邮箱格式"})
reply = forms.BooleanField(required=False, label="是否回复")
在视图中,根据是GET
还是POST
请求来做相应的操作。如果是GET
请求,那么返回一个空的表单,如果是POST
请求,那么将提交上来的数据进行校验。
# views.py
from django.shortcuts import render,HttpResponse
from django.views.generic import View # 加载视图类
from .forms import FormTable # 加载表单类
# Create your views here.
# from django.forms.utils import ErrorDict # 这个是表单类的errors的类型
class MessageForm(View):
def get(self, request):
form = FormTable()
return render(request, "index.html", context={"form": form})
def post(self, request):
form = FormTable(request.POST)
if form.is_valid(): # 如果各个字段合法
title = form.cleaned_data.get("title")
content = form.cleaned_data.get("content")
email = form.cleaned_data.get("email")
reply = form.cleaned_data.get("reply")
print("title: {}\ncontentL {}\nemail: {}\nreply: {}\n".format(title,content,email,reply))
return HttpResponse("success")
else:
print(type(form.errors))
print(form.errors.get_json_data())
return HttpResponse("failure")
在使用GET
请求的时候,我们传了一个form
给模板,那么以后模板就可以使用form
来生成一个表单的html
代码。在使用POST
请求的时候,我们根据前端上传上来的数据,构建一个新的表单,这个表单是用来验证数据是否合法的,如果数据都验证通过了,那么我们可以通过cleaned_data
来获取相应的数据。在模板中渲染表单的HTML
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<table>
{{ form.as_table }}
<tr>
<td></td>
<td><input type="submit" name="提交" ></td>
</tr>
</table>
</form>
</body>
</html>
我们在最外面给了一个form
标签,然后在里面使用了table
标签来进行美化,在使用form
对象渲染的时候,使用的是table
的方式,当然还可以使用ul
的方式(as_ul
),也可以使用p
标签的方式(as_p
),并且在后面我们还加上了一个提交按钮。这样就可以生成一个表单了
下面是表单类.errors.get_json_data()方法返回的值
{'title': [{'message': 'Ensure this value has at least 5 characters (it has 4).', 'code': 'min_length'}], 'content': [{'message': 'This field is required.', 'code': 'required'}], 'email': [{'message': 'This field is required.', 'code': 'required'}]
在表单类(这里是FormTable
)中给各个字段添加errors_message
添加键值对后可修改错误提示
{'title': [{'message': '字符至少5个,至多100个', 'code': 'min_length'}], 'content': [{'message': '要有content内容', 'code': 'required'}], 'email': [{'message': '必须是邮箱格式', 'code': 'required'}]}