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 formsclass 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.pyfrom django.shortcuts import render,HttpResponsefrom 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'}]}
