一:什么是ModelForm呢?

Model + Form ==> ModelForm。model和form的结合体,所以有以下功能:

  • 数据验证
  • 数据库操作

model有操作数据库的字段,form验证也有那几个字段,虽然耦合度降低,但是代码是有重复的。如果利用model里的字段,那是不是form里的字段就不用写了。

二:下面是一个简单是例子:

from django.db import modelsclass CustomerInfo(models.Model):"""客户表"""name = models.CharField(max_length=64)contact_type_choices = ((0,'QQ'),(1,'微信'),(2,'手机'))contact_type = models.SmallIntegerField(choices=contact_type_choices)contact = models.CharField(max_length=64,unique=True,verbose_name="联系方式")source_choices = ((0,'QQ群'),(1,'51CTO'),(2,'百度推广'),(3,'知乎'),(4,'转介绍'),(5,'其它'))source = models.SmallIntegerField(choices=source_choices,verbose_name="客户来源")referral_from = models.ForeignKey("self",blank=True,null=True,verbose_name="转介绍",on_delete=models.CASCADE)consult_courses = models.ManyToManyField("Course",verbose_name="咨询课程")consult_content = models.TextField(verbose_name="咨询内容")status_choices = ((0, '未报名'), (1, '已报名'), (2, '已退学'))status = models.SmallIntegerField(choices=status_choices,verbose_name="状态")consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问",on_delete=models.CASCADE)date = models.DateField(auto_now_add=True)def __str__(self):return self.name

models.py

from django.forms import ModelForm
from crm import models
from django import formsclass CustomerForm(ModelForm):class Meta:model = models.CustomerInfofields = '__all__'exclude = ['consult_content', 'status', 'consult_courses']readonly_fields = ['contact_type','contact','consultant','referral_from','source']   #并不是真正的设置可读模式,而是用于自定制def __new__(cls, *args, **kwargs):      # cls 就是实例(self)for field_name in cls.base_fields:field_obj = cls.base_fields[field_name]field_obj.widget.attrs.update({'class':'form-control'})if field_name in cls.Meta.readonly_fields:field_obj.widget.attrs.update({'disabled':'true'})# print(cls.Meta)# print(cls.Meta.exclude)return ModelForm.__new__(cls)def clean(self):"""对数据进行验证,此方法需要在form.is_valid()后才能生效"""# print("cleaned_dtat:", self.cleaned_data)if self.errors:  # 表单级别的错误raise forms.ValidationError(("Please fix errors before re-submit."))for field in self.Meta.readonly_fields:old_field_val = getattr(self.instance,field)new_form_val = self.cleaned_data[field]if old_field_val != new_form_val:self.add_error(field,"Readonly Field: field should be '{value}' ,not '{new_value}' ".\format(**{'value':old_field_val,'new_value':new_form_val}))

forms

def enrollment(request,enrollment_id):"""②学员确认信息"""customer_form = forms.CustomerForm(instance=enrollment_obj.customer)if request.method == "POST":customer_form = forms.CustomerForm(instance=enrollment_obj.customer,data=request.POST)if customer_form.is_valid():customer_form.save()return HttpResponse('合同正在审核中,请等候...')return render(request,'crm/enrollment.html',locals())

views

注意我们如何在POST和GET情况下传递实例(instance)。

三、Meta的作用:

  • ModelForm 通过 Meta 把 db.Field 自动转化为 forms.Field,其中涉及到几步转化
  • validators 不变
  • 添加 widget 属性,即前端的渲染方式
  • 修改 Model 包含的字段,通过 fields 来拿指定字段或者通过 exclude 来排除指定字段
  • 修改错误信息

class Meta:model = models.UserInfofields = '__all__'# fields =  ['username','email']# exclude = ['username']labels = {'username': '用户名','email': '邮箱',}help_texts = {'username': '...'}widgets = {'username': Fwidgets.Textarea(attrs={'class': 'c1'})}error_messages = {'__all__':{},'email': {'required': '邮箱不能为空','invalid': '邮箱格式错误..',}}field_classes = {# 'email': Ffields.URLField}# localized_fields=('ctime',)

Meta的另一个例子

转载于:https://www.cnblogs.com/ray-h/p/10415269.html

Django之ModelForm使用相关推荐

  1. Django之ModelForm验证

    一.简介 Django中Model负责操作数据库,并且具有简单的数据库验证功能(基本不用):Form用于用户请求的验证,具有强悍的数据库验证功能:ModelForm是将二者合二为一,即可用于数据库操作 ...

  2. Django的ModelForm

    这个组件的功能就是把model和form组合起来 1.创建ModelForm 1.model.py中创建模型表 class Book(models.Model):title=models.CharFi ...

  3. Django 之 modelForm (edit.html页面的编写)

    models.py文件 from django.db import models# Create your models here. from django.db import models# Cre ...

  4. Django Form ModelForm modelfromset

    forms 组件 Form 组件 form表单完成的事情 提供input可以提交数据 对提交的数据进行校验 提供错误提示 定义form组件 from django import forms class ...

  5. Django之modelform

    1.原生form表单 2.forms组件2 3.modleForm组件 4.前端form表单,后台form组件(可以没有数据库) 5.django补充 - 请求流程 1.原生form表单 步骤: 1. ...

  6. Django之ModelForm详解

    前言 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来.先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱 ...

  7. django自定义modelform的choice选项展示内容

    应用场景 在新增项目的任务时,需要指派任务的执行者.默认modelform会吧执行者所在的用户表的所有数据全部放在choice中. 但是实际仅需要展示当前项目参与者的人,从中选择执行者,故我们需要对m ...

  8. python django 表单_Django ModelForm与Form

    django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form 基于dj ...

  9. Django——Model

    一. ORM 在 MVC 或者说 MTV 设计模式中,模型(M)代表对数据库的操作.那么如何操作数据库呢? 我们可以在 Python 代码中嵌入 SQL 语句. 但是问题又来了,Python 怎么连接 ...

最新文章

  1. java string s_Java字符串:“String s=新字符串(”愚蠢“);
  2. Revising Aggregations - The Sum Function(集合函数-sum)
  3. VS.Net 2005 Beta2连接Team Foundation Server的问题
  4. 快递信息管理系统源代码c++_学生信息管理系统C语言版
  5. 开启一个新的命令行窗口
  6. windows查看系统版本号
  7. 标准SQL注入入侵语句
  8. linux龙芯自动挂载u盘,Windows Subsystem for Linux (WSL)挂载移动硬盘U盘
  9. tomcat vue 不用 前后端_部署前后端分离项目(后端 tomcat 前端 nginx)
  10. 力扣-1641. 统计字典序元音字符串的数目
  11. border 0px和border none的区别
  12. GMF:示例Mindmap 练习一
  13. 使用vue+HBulider云游戏接口开发单击斗地主网页版
  14. 弘辽科技:加速布局机器人赛道,字节跳动有哪些“大心思”?
  15. CentOS7恢复rm -rf 误删的xfs系统
  16. 关于WZ指令的配网与烧写固件
  17. android adb日志过滤包名,android studio logcat 无筛选 显示全部日志 无应用包名区分方式...
  18. win2008系统漏洞扫描所得的几个漏洞详解
  19. Android Fragment already added 解决方式
  20. centos6.8服务器中了挖矿程序病毒的解决方法

热门文章

  1. 网页输入数据到mysql_为什么用PHP编写的网页中,输入的数据不能插入到Mysql数据库中?...
  2. 前端aes加密_前端安全攻防解析
  3. python代码优化_Python 代码性能优化技巧
  4. 小米路由器4a刷第三方固件_小米路由器4A的断网问题初探
  5. rust睡觉按键没反应_扫描仪四个按键分别是
  6. C语言:编写一个函数,计算二维数组中的最大元素,数组以指针的方式传递
  7. python中plt定义,对Python中plt的画图函数详解
  8. PAT (Basic Level) Practice1028 人口普查
  9. clickhouse分布式查询
  10. spark.network.timeout参数入门