一:什么是ModelForm呢?

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

  • 数据验证
  • 数据库操作

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

二:下面是一个简单是例子:
from django.db import models

class CustomerInfo(models.Model):
"""客户表"""
name = models.CharField(max_length=)
contact_type_choices = ((,'QQ'),(,'微信'),(,'手机'))
contact_type = models.SmallIntegerField(choices=contact_type_choices)
contact = models.CharField(max_length=,unique=True,verbose_name="联系方式")
source_choices = ((,'QQ群'),(,'51CTO'),(,'百度推广'),(,'知乎'),(,'转介绍'),(,'其它'))
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 = ((, '未报名'), (, '已报名'), (, '已退学'))
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 forms class CustomerForm(ModelForm):
class Meta:
model = models.CustomerInfo
fields = '__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.UserInfo
fields = '__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的另一个例子

Django之ModelForm使用的更多相关文章

  1. Django中ModelForm应用

    Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...

  2. Django的ModelForm

    基于django.forms.ModelForm:与模型类绑定的Form 先定义一个ModelForm类,继承ModelForm类 from django.forms import ModelForm ...

  3. Django中Model-Form验证

    Django中Model-Form验证 class UserType(models.Model): caption=models.CharField(max_length=32) class User ...

  4. django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息

    django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...

  5. Django 四——ModelForm用法

    内容概要: 1.新增数据库表中数据 2.更新数据库表中数据 Django的ModelForm Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分 ...

  6. Django(十四)课程机构列表页数据展示,Django的modelform,关于urls的重新分发

    关于urls的重新分发: 如果所有url都配置在根路径的urls.py里,会特别多,而且也不易于修改,Django框架里支持urls的重新分发: 1.在根路径的urls配置上: PS:namespac ...

  7. 【Django】--ModelForm组件

    ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...

  8. Django的ModelForm组件

    创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...

  9. Django之modelform组件

    一.简介与基本使用 简介:django中的modelform组件同时具有model和form作用,但是耦合度比较高,当项目需要拆分时候就比较困难了,所以在使用modelform时候需要先考虑项目的扩展 ...

  10. 【django之modelform】

    一.什么是modelform ModelForm顾名思义就Form和Django的Model数据库模型结合体,可以简单.方便得对数据库进行增加.编辑操作和验证标签的生成: 举例说明: 比如我们的数据库 ...

随机推荐

  1. 总结day26 ----验证客户端的合法性,已经操作系统,进程的简单初识别

    前情提要 一:验证客户端的合法性: # .需要认证 # 程序和用户打交道的时候才会用到用户认证 # 对所有的客户端进行统一的认证 # # 我现在要做的事情 # 写一个server端 # 写一个clie ...

  2. Windows Server2008如何打开添加IIS服务器

    https://jingyan.baidu.com/article/1612d500aa4594e20e1eeefc.html

  3. string常用字符串操作函数

    1.strdup和strndup 说明:strdup() 函数将参数 s 指向的字符串复制到一个字符串指针上去,这个字符串指针事先可以没被初始化.在复制时,strdup() 会给这个指针分配空间,使用 ...

  4. python学习,day4:生成器

    1.生成器:只有在调用是才会生成相应的数据.(比较省内存,它只保留当时生成的.而列表会保存整个列表) a = [i*2 for i in range(10)] #列表生成式 print(a) 这样会把 ...

  5. Jupyter Notebook & Spyder 常用快捷键

    Jupyter Notebook: 1. "shift + enter" notebook单元格内执行代码,并且自动跳至下一个的单元格 2. "tab" 自动补 ...

  6. 8. JavaScript学习笔记——事件

    8. 事件 8.1 事件基础 /// 事件就是用户或浏览器自身执行的某种动作.诸如 click.load 和 mouseover,都是事件的名字.而响应某个事件的函数就叫做事件处理程序(或事件侦听器) ...

  7. (转)如何在CentOS / RHEL 7上安装Elasticsearch,Logstash和Kibana(ELK)

    原文:https://www.howtoing.com/install-elasticsearch-logstash-and-kibana-elk-stack-on-centos-rhel-7 如果你 ...

  8. C# 数组基础

    一.数组的基础知识 1.数组有什么用? 如果需要同一个类型的多个对象,就可以使用数组.数组是一种数组结构,它可以包含同一个类型的多个元素. 2.数组的初始化方式 第一种:先声明后赋值 ]; array ...

  9. PHPStorm操作小技巧

    1.围绕选中字符输入引号或者括号 2.设置服务器部署 3.隐藏Project快捷键 Shift + Esc 4.IDE内窗口切换 Ctrl + TAB 5.关闭当前项目 File -> Clos ...

  10. hibernate多对一单向关联注解方式

    多对一单向关联,在多的一方加上一的一方作为外键.在程序里表现为:在多的一方加上一的引用. 小组类Group,用户User: Group: package com.oracle.hibernate; i ...