前言
这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来。
比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册时间等等一大堆信息,现在让你写一个创建学生的页面,你的后台应该怎么写呢?
首先我们会在前端一个一个罗列出这些字段,让用户去填写,然后我们从后台一个一个接收用户的输入,创建一个新的学生对象,保存起来。
其实,重点不是这些,而是合法性验证,我们需要在前端判断用户输入是否合法,比如姓名必须在多少字符以内,电话号码必须是多少位的数字,邮箱必须是邮箱的格式这些。当然可以一点一点手动写限制,各种判断,这毫无问题,不过比较麻烦。
我们现在有个更优雅(以后在Python相关的内容里,要多用“优雅”这个词,并且养成习惯)的方法:ModelForm
1、接口开发的一般流程
- 梳理业务逻辑(技术设计)
- 建表、定义模型类(models.py)
- 设计表单验证(forms.py)
- 设计视图函数(views.py)
- 绑定路由和视图函数(基于函数、类的视图)
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)
class Meta: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)
def __str__(self):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)
def __str__(self):return self.name
<a name="gMWR5"></a>## forms.py-(用ModelForm,设计表单验证)```pythonfrom . import modelsfrom django import forms # 导入forms# 如果form对应了一个modelclass GradeForm(forms.ModelForm):# password2 = forms.CharField(min_length=6,max_length=13)# 数据库表中没有的字段,业务上需要校验的字段,可以在这里定义,和普通的form一样class Meta:model = models.Grade # 指定对应的模型类fields = "__all__" # 校验表里面所有字段# fields = ["name",""] # 校验表里面哪些字段# exclude = [] # 不校验表里哪些字段# 如果字段需要单独校验,也可以像普通的form一样 单独 用clean_xxx 去校验# def clean_name(self):# name = self.cleaned_data["name"]# if not name.startswith("班级"):# raise forms.ValidationError("班级名需要以“班级”开头")# return name
views.py-基于类的视图(设计视图函数)
from django.core.paginator import Paginatorfrom django.forms import model_to_dictfrom django.shortcuts import renderfrom django.views import Viewfrom django.http.response import JsonResponsefrom django.db.models import Qfrom . import forms, modelsclass GradeView(View):def post(self, request):form = forms.GradeForm(request.POST)if form.is_valid():obj = form.save() # 保存到数据库,并返回这个记录的对象return JsonResponse({"code": 0, "msg": "操作成功", "id": obj.id})return JsonResponse({"code": -1, "msg": form.errors.get_json_data()})# 如果没有校验通过,返回form的校验信息
urls.py文件
from django.contrib import adminfrom django.urls import pathfrom order import views as order_viewurlpatterns = [path('admin/', admin.site.urls),path('order/grade_new', order_view.GradeView.as_view()),# as_view()方法绑定路由和 CBV基于类的视图]
参考博客
博客园: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
