前言

这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把modelform组合起来。
比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册时间等等一大堆信息,现在让你写一个创建学生的页面,你的后台应该怎么写呢?
首先我们会在前端一个一个罗列出这些字段,让用户去填写,然后我们从后台一个一个接收用户的输入,创建一个新的学生对象,保存起来。
其实,重点不是这些,而是合法性验证,我们需要在前端判断用户输入是否合法,比如姓名必须在多少字符以内,电话号码必须是多少位的数字,邮箱必须是邮箱的格式这些。当然可以一点一点手动写限制,各种判断,这毫无问题,不过比较麻烦。
我们现在有个更优雅(以后在Python相关的内容里,要多用“优雅”这个词,并且养成习惯)的方法:ModelForm

1、接口开发的一般流程

  1. 梳理业务逻辑(技术设计)
  2. 建表、定义模型类(models.py)
  3. 设计表单验证(forms.py)
  4. 设计视图函数(views.py)
  5. 绑定路由和视图函数(基于函数、类的视图)

    2、ModelForm使用实例

    models.py-(建表、定义模型类)

    ```python from django.db import models

Create your models here.

class BaseModel(models.Model): # 基类 update_time = models.DateTimeField(auto_now=True) create_time = models.DateTimeField(auto_now_add=True)

  1. class Meta:
  2. abstract = True # 说明这个类只是用来继承的。(就不会创建这个表了)

定义一个 班级表 模型类

class Grade(BaseModel): # 继承这个基类 name = models.CharField(verbose_name=”班级”, max_length=30, unique=True) desc = models.CharField(verbose_name=”班级描述”, max_length=50, null=True, blank=True)

  1. def __str__(self):
  2. return self.name

定义一个 学生表 模型类

class Student(BaseModel): # 继承这个基类 name = models.CharField(max_length=30, verbose_name=”姓名”) phone = models.CharField(max_length=11, verbose_name=”手机号”, unique=True) qq = models.CharField(max_length=11, verbose_name=”qq”, unique=True) grade = models.ForeignKey(Grade, on_delete=models.CASCADE)

  1. def __str__(self):
  2. return self.name
  1. <a name="gMWR5"></a>
  2. ## forms.py-(用ModelForm,设计表单验证)
  3. ```python
  4. from . import models
  5. from django import forms # 导入forms
  6. # 如果form对应了一个model
  7. class GradeForm(forms.ModelForm):
  8. # password2 = forms.CharField(min_length=6,max_length=13)
  9. # 数据库表中没有的字段,业务上需要校验的字段,可以在这里定义,和普通的form一样
  10. class Meta:
  11. model = models.Grade # 指定对应的模型类
  12. fields = "__all__" # 校验表里面所有字段
  13. # fields = ["name",""] # 校验表里面哪些字段
  14. # exclude = [] # 不校验表里哪些字段
  15. # 如果字段需要单独校验,也可以像普通的form一样 单独 用clean_xxx 去校验
  16. # def clean_name(self):
  17. # name = self.cleaned_data["name"]
  18. # if not name.startswith("班级"):
  19. # raise forms.ValidationError("班级名需要以“班级”开头")
  20. # return name

views.py-基于类的视图(设计视图函数)

  1. from django.core.paginator import Paginator
  2. from django.forms import model_to_dict
  3. from django.shortcuts import render
  4. from django.views import View
  5. from django.http.response import JsonResponse
  6. from django.db.models import Q
  7. from . import forms, models
  8. class GradeView(View):
  9. def post(self, request):
  10. form = forms.GradeForm(request.POST)
  11. if form.is_valid():
  12. obj = form.save() # 保存到数据库,并返回这个记录的对象
  13. return JsonResponse({"code": 0, "msg": "操作成功", "id": obj.id})
  14. return JsonResponse({"code": -1, "msg": form.errors.get_json_data()})
  15. # 如果没有校验通过,返回form的校验信息

urls.py文件

  1. from django.contrib import admin
  2. from django.urls import path
  3. from order import views as order_view
  4. urlpatterns = [
  5. path('admin/', admin.site.urls),
  6. path('order/grade_new', order_view.GradeView.as_view()),
  7. # as_view()方法绑定路由和 CBV基于类的视图
  8. ]

参考博客

博客园:Django之ModelForm详解
https://www.cnblogs.com/yangyangming/p/11157755.html
C语言中文网:Django ModelForm用法详解
http://c.biancheng.net/view/7991.html
CSDN:表单_ModelForm
https://blog.csdn.net/zh18380113164/article/details/108567476