Django中的表单丰富了传统的HTML语言中的表单。在Django中的表单,主要做以下两件事:

  1. 渲染表单模板。(不常用,容易前后端耦合)
  2. 表单验证数据是否合法。

Django中表单使用流程

在一个app中新建一个forms.py,定义一个表单类,继承自django.forms.Form

Field字段名称在html中对应的是<input type="text" name="field_name" >中input标签的name属性

比如title字段在html中就是<input type="text" name="title">

  1. from django import forms
  2. class FormTable(forms.Form):
  3. # label是渲染字段的名称(默认是变量名),error_messages的键值对是{"'code'对应的值": "你想要显示的内容"}
  4. title = forms.CharField(min_length=5, max_length=100, label="标题",
  5. error_messages={"min_length": "字符至少5个,至多100个"})
  6. content = forms.CharField(widget=forms.Textarea, label="内容",
  7. error_messages={"required": "要有content内容"})
  8. email = forms.EmailField(label="邮箱", error_messages={"required": "必须是邮箱格式"})
  9. reply = forms.BooleanField(required=False, label="是否回复")

在视图中,根据是GET还是POST请求来做相应的操作。如果是GET请求,那么返回一个空的表单,如果是POST请求,那么将提交上来的数据进行校验。

  1. # views.py
  2. from django.shortcuts import render,HttpResponse
  3. from django.views.generic import View # 加载视图类
  4. from .forms import FormTable # 加载表单类
  5. # Create your views here.
  6. # from django.forms.utils import ErrorDict # 这个是表单类的errors的类型
  7. class MessageForm(View):
  8. def get(self, request):
  9. form = FormTable()
  10. return render(request, "index.html", context={"form": form})
  11. def post(self, request):
  12. form = FormTable(request.POST)
  13. if form.is_valid(): # 如果各个字段合法
  14. title = form.cleaned_data.get("title")
  15. content = form.cleaned_data.get("content")
  16. email = form.cleaned_data.get("email")
  17. reply = form.cleaned_data.get("reply")
  18. print("title: {}\ncontentL {}\nemail: {}\nreply: {}\n".format(title,content,email,reply))
  19. return HttpResponse("success")
  20. else:
  21. print(type(form.errors))
  22. print(form.errors.get_json_data())
  23. return HttpResponse("failure")

在使用GET请求的时候,我们传了一个form给模板,那么以后模板就可以使用form来生成一个表单的html代码。在使用POST请求的时候,我们根据前端上传上来的数据,构建一个新的表单,这个表单是用来验证数据是否合法的,如果数据都验证通过了,那么我们可以通过cleaned_data来获取相应的数据。在模板中渲染表单的HTML代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="" method="post">
  9. <table>
  10. {{ form.as_table }}
  11. <tr>
  12. <td></td>
  13. <td><input type="submit" name="提交" ></td>
  14. </tr>
  15. </table>
  16. </form>
  17. </body>
  18. </html>

我们在最外面给了一个form标签,然后在里面使用了table标签来进行美化,在使用form对象渲染的时候,使用的是table的方式,当然还可以使用ul的方式(as_ul),也可以使用p标签的方式(as_p),并且在后面我们还加上了一个提交按钮。这样就可以生成一个表单了

下面是表单类.errors.get_json_data()方法返回的值

  1. {'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添加键值对后可修改错误提示

  1. {'title': [{'message': '字符至少5个,至多100个', 'code': 'min_length'}], 'content': [{'message': '要有content内容', 'code': 'required'}], 'email': [{'message': '必须是邮箱格式', 'code': 'required'}]}