Django之ModelForm使用
一:什么是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使用的更多相关文章
- Django中ModelForm应用
Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...
- Django的ModelForm
基于django.forms.ModelForm:与模型类绑定的Form 先定义一个ModelForm类,继承ModelForm类 from django.forms import ModelForm ...
- Django中Model-Form验证
Django中Model-Form验证 class UserType(models.Model): caption=models.CharField(max_length=32) class User ...
- django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息
django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...
- Django 四——ModelForm用法
内容概要: 1.新增数据库表中数据 2.更新数据库表中数据 Django的ModelForm Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分 ...
- Django(十四)课程机构列表页数据展示,Django的modelform,关于urls的重新分发
关于urls的重新分发: 如果所有url都配置在根路径的urls.py里,会特别多,而且也不易于修改,Django框架里支持urls的重新分发: 1.在根路径的urls配置上: PS:namespac ...
- 【Django】--ModelForm组件
ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...
- Django的ModelForm组件
创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...
- Django之modelform组件
一.简介与基本使用 简介:django中的modelform组件同时具有model和form作用,但是耦合度比较高,当项目需要拆分时候就比较困难了,所以在使用modelform时候需要先考虑项目的扩展 ...
- 【django之modelform】
一.什么是modelform ModelForm顾名思义就Form和Django的Model数据库模型结合体,可以简单.方便得对数据库进行增加.编辑操作和验证标签的生成: 举例说明: 比如我们的数据库 ...
随机推荐
- 总结day26 ----验证客户端的合法性,已经操作系统,进程的简单初识别
前情提要 一:验证客户端的合法性: # .需要认证 # 程序和用户打交道的时候才会用到用户认证 # 对所有的客户端进行统一的认证 # # 我现在要做的事情 # 写一个server端 # 写一个clie ...
- Windows Server2008如何打开添加IIS服务器
https://jingyan.baidu.com/article/1612d500aa4594e20e1eeefc.html
- string常用字符串操作函数
1.strdup和strndup 说明:strdup() 函数将参数 s 指向的字符串复制到一个字符串指针上去,这个字符串指针事先可以没被初始化.在复制时,strdup() 会给这个指针分配空间,使用 ...
- python学习,day4:生成器
1.生成器:只有在调用是才会生成相应的数据.(比较省内存,它只保留当时生成的.而列表会保存整个列表) a = [i*2 for i in range(10)] #列表生成式 print(a) 这样会把 ...
- Jupyter Notebook & Spyder 常用快捷键
Jupyter Notebook: 1. "shift + enter" notebook单元格内执行代码,并且自动跳至下一个的单元格 2. "tab" 自动补 ...
- 8. JavaScript学习笔记——事件
8. 事件 8.1 事件基础 /// 事件就是用户或浏览器自身执行的某种动作.诸如 click.load 和 mouseover,都是事件的名字.而响应某个事件的函数就叫做事件处理程序(或事件侦听器) ...
- (转)如何在CentOS / RHEL 7上安装Elasticsearch,Logstash和Kibana(ELK)
原文:https://www.howtoing.com/install-elasticsearch-logstash-and-kibana-elk-stack-on-centos-rhel-7 如果你 ...
- C# 数组基础
一.数组的基础知识 1.数组有什么用? 如果需要同一个类型的多个对象,就可以使用数组.数组是一种数组结构,它可以包含同一个类型的多个元素. 2.数组的初始化方式 第一种:先声明后赋值 ]; array ...
- PHPStorm操作小技巧
1.围绕选中字符输入引号或者括号 2.设置服务器部署 3.隐藏Project快捷键 Shift + Esc 4.IDE内窗口切换 Ctrl + TAB 5.关闭当前项目 File -> Clos ...
- hibernate多对一单向关联注解方式
多对一单向关联,在多的一方加上一的一方作为外键.在程序里表现为:在多的一方加上一的引用. 小组类Group,用户User: Group: package com.oracle.hibernate; i ...