前言
这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把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,设计表单验证)
```python
from . import models
from django import forms # 导入forms
# 如果form对应了一个model
class 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 Paginator
from django.forms import model_to_dict
from django.shortcuts import render
from django.views import View
from django.http.response import JsonResponse
from django.db.models import Q
from . import forms, models
class 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 admin
from django.urls import path
from order import views as order_view
urlpatterns = [
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