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数据库模型结合体,可以简单.方便得对数据库进行增加.编辑操作和验证标签的生成: 举例说明: 比如我们的数据库 ...
随机推荐
- git 命令摘录
回滚 n 个 commit (增加了revert commit) git revert -n commit_id 回滚到指定的commit_id(不增加commit,回滚的commit_id被删除) ...
- windows 域的安装方法
前面的博客中我们知道了 Windows AD域的升级,下面我谈谈Windows域的安装和卸载. 卸载AD域 配置备份AD域 安装子域 删除子域(必须在根域管理员模式下删除,否则无法删除) 删除命令 导 ...
- Java多线程——对象组合
我们不希望对每一次的内存访问都进行分析以确保程序是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组件或者程序,这里介绍一些组合模式,这些组合模式能够使一个类更容易成为线程安全的,并且在维 ...
- 【JSP】jsp报错:Syntax error, insert "}" to complete MethodBody
使用MyEclipse编写JSP的时候有时会报错误如下 Syntax error, insert "}" to complete MethodBody 大体意思就是说方法体缺少缺少 ...
- linux 创建软链接和硬链接
Linux 系统中有软链接和硬链接两种特殊的“文件”. 软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录. 硬链接则透过文件系统的inode来产生新档名,而不是产生新档案. ...
- 用sql语句导出oracle中的存储过程和函数
用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' repl ...
- java中的this和super(构造函数)
1.this:表示当前对象 常用的代码: public class A{ private String name; public void setName(String name){ this.nam ...
- hadoop-0.20.2安装配置
该环境在Vmware Workstation 12 上安装配置一共三台机器master,slave1,slave2. 操作系统:Cenos 7.0 hadoop 版本:hadoop-0.20.2,版本 ...
- 十分钟理解Actor模式
Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing.所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor.共享内存更适合单 ...
- PHP命名规则
参考: http://nowhisky.diandian.com/post/2012-08-12/40033898638 就一般约定而言,类.函数和变量的名字应该是能够让代码阅读者能够容易地知道这些代 ...