1、form介绍

我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。

Django form组件就实现了上面所述的功能。
总结一下,其实form组件的主要功能如下:

  • 生成页面可用的HTML标签
  • 对用户提交的数据进行校验(校验请求参数、也可以做请求参数的数据加工
  • 保留上次输入内容

2、form使用

user_demo这个应用的模型类

  1. from django.db import models
  2. from django.core.paginator import Paginator
  3. # Create your models here.
  4. class NewUser(models.Model):
  5. phone = models.CharField(verbose_name="手机号",max_length=11,unique=True)
  6. email = models.EmailField(verbose_name="邮箱",max_length=50,unique=True)
  7. nick = models.CharField(verbose_name="昵称", max_length=50)
  8. password = models.CharField(verbose_name="密码",max_length=32)
  9. class Meta:
  10. verbose_name = "用户表"
  11. verbose_name_plural = verbose_name
  12. db_table = "new_user" # 映射的用户注册表名称
  13. def __str__(self):
  14. return self.nick

2.1、简写版本

2.1.1、在应用目录下创建forms.py文件,定义一个 自定义类

这个类用来校验注册接口

  1. from django import forms
  2. from . import models
  3. class RegisterForms(forms.Form):
  4. phone = forms.CharField(min_length=11, max_length=11)
  5. email = forms.EmailField()
  6. nick = forms.CharField()
  7. password = forms.CharField(min_length=6,max_length=13)
  8. password2 = forms.CharField(min_length=6,max_length=13)
  9. def clean_phone(self):
  10. phone = self.cleaned_data["phone"]
  11. if not phone.isdigit():
  12. raise forms.ValidationError("手机号格式错误~")
  13. if models.NewUser.objects.filter(phone=phone).exists():
  14. raise forms.ValidationError("手机号已存在!")
  15. return phone
  16. def clean_email(self):
  17. email = self.cleaned_data["email"]
  18. if models.NewUser.objects.filter(email=email).exists():
  19. raise forms.ValidationError("邮箱已存在!")
  20. return email
  21. def clean(self):
  22. cleaned_data = super().clean()
  23. if not self.errors: # 判断前面的 clean_xxx 基本的校验是否有错误
  24. password = cleaned_data["password"]
  25. password2 = cleaned_data["password2"]
  26. if password2 != password:
  27. raise forms.ValidationError("两次输入的密码不一致!")
  28. return cleaned_data

2.1.2、写一个对应的视图函数

这个视图函数就是注册接口,简写(没有操作数据库)

  1. from django.http import JsonResponse, HttpResponse
  2. from . import forms
  3. # Create your views here.
  4. def new_register(request):
  5. form = forms.RegisterForms(request.POST)
  6. # 实例化form对象的时候,把post提交过来的数据直接传进去
  7. # form表单的参数应该与forms组件的字段名称一致
  8. if form.is_valid():
  9. print(form.cleaned_data)
  10. return JsonResponse({"code":0,"msg":"success!"})
  11. # return HttpResponse("ok")
  12. else:
  13. print(form.errors.get_json_data())
  14. return JsonResponse(form.errors.get_json_data())
  15. # return HttpResponse("error")

注意:
在urls.py文件中绑定 路由和这个视图函数

image.pngimage.png

2.2、完善版本

2.2.1、完善后的forms.py

  1. import hashlib
  2. from django import forms
  3. from . import models
  4. class RegisterForms(forms.Form):
  5. phone = forms.CharField(min_length=11, max_length=11)
  6. email = forms.EmailField()
  7. nick = forms.CharField()
  8. password = forms.CharField(min_length=6,max_length=13)
  9. password2 = forms.CharField(min_length=6,max_length=13)
  10. def clean_phone(self):
  11. phone = self.cleaned_data["phone"]
  12. if not phone.isdigit():
  13. raise forms.ValidationError("手机号格式错误~")
  14. if models.NewUser.objects.filter(phone=phone).exists():
  15. raise forms.ValidationError("手机号已存在!")
  16. return phone
  17. def clean_email(self):
  18. email = self.cleaned_data["email"]
  19. if models.NewUser.objects.filter(email=email).exists():
  20. raise forms.ValidationError("邮箱已存在!")
  21. return email
  22. def clean(self):
  23. cleaned_data = super().clean()
  24. if not self.errors: # 判断前面的 clean_xxx 基本的校验是否有错误
  25. password = cleaned_data["password"]
  26. password2 = cleaned_data["password2"]
  27. if password2 != password:
  28. raise forms.ValidationError("两次输入的密码不一致!")
  29. # 数据加工
  30. cleaned_data.pop("password2") # 将请求参数的 password2 删除,和数据库字段一致
  31. cleaned_data["password"]=md5(cleaned_data["password"]) # 将这个明文密码加密
  32. return cleaned_data # 返回处理好的请求参数
  33. def md5(password:str)->str:
  34. """
  35. 用来将明文密码MD5加密
  36. :param password: 密码明文
  37. :return: MD5加密后的密码
  38. """
  39. md5_password = hashlib.md5(password.encode())
  40. return md5_password.hexdigest()

2.2.2、完善后的注册接口

  1. from django.http import JsonResponse, HttpResponse
  2. from . import forms
  3. # Create your views here.
  4. def new_register(request):
  5. form = forms.RegisterForms(request.POST)
  6. # 实例化form对象的时候,把post提交过来的数据直接传进去
  7. # form表单的参数应该与forms组件的字段名称一致
  8. if form.is_valid():
  9. print(form.cleaned_data)
  10. models.NewUser.objects.create(**form.cleaned_data)
  11. #解包form的字典数据
  12. # 要求form的字典数据 数量、key名称 和数据库要交互的表保持一致
  13. return JsonResponse({"code":0,"msg":"success!"})
  14. # return HttpResponse("ok")
  15. else:
  16. print(form.errors.get_json_data())
  17. return JsonResponse(form.errors.get_json_data())
  18. # return HttpResponse("error")

image.pngimage.png

参考博客

脚本之家:Django中的forms组件实例详解
https://www.jb51.net/article/150420.htm