django之ModelForm的用法
概述:
ModelForm类是form是组件中Form的一个子类,所以,也是处理表单的,但功能要比Form类强大,而且使用方便。
步骤:
1、自定义一个类,继承ModelForm
from django import forms
class BookModelForm(forms.ModelForm):
class Meta:
model = models.Book #选定一个表对应的模型类
fields = ['title','price'] #要进行数据校验的字段
fields = "__all__" #校验所有的字段
exclude =['pub_date'] #排除校验的字段
#自定义钩子
def clean_title(self):
val = self.cleaned_date.get('title')
if not val.isdigit():
return val
else:
raise ValidationError("书名不能是纯数字")
2、使用ModelForm校验数据
def addbook(request):
if request.method=="POST": form=BookModelForm(request.POST)
if form.is_valid(): #判断校验是否通过
form.save() #保存数据
return redirect("/books/")
else:
return render(request, 'addbook.html', locals()) #带着出错的数据传给addbook.html,显示错误信息 else:
form=BookModelForm() # modelforms组件
return render(request,'addbook.html',locals())
数据校验
知识补充:
choices的用法:
1/ 在模型类中 比如员工表:
gender = models.IntegerField(choices=((1, '男‘ ) , (2 , '女' )))
alex是模型类的一个对象
alex.gender ----> 1
alex.get_gender_display() ------>男
2/ 在form类中(会自动渲染成select标签)
state= forms.ChoiceField(choices = ((1, '已出版' ), (2, '未出版' )))
一对多关系字段:
publish = forms.ChoiceField(choices = (list(models.publish.objects.all().value_list('pk', 'name' ))))
或 publish = forms.ModelChoiceField( queryset=models.Publish.objects.all() )
多对多关系字段:
authors = forms,ModelMultipleChoiceField(queryset = models.Author.objects.all())
widgets用法
form django import forms from django.forms import widgets class EmpForm(forms.Form):
name=forms.CharField(min_length=5,
label="姓名",
error_messages={"required":"该字段不能为空!"},
widget=widgets.TextInput(attrs={"class":"form-control","id":"yuan"})
)
age=forms.IntegerField(label="年龄",
widget=widgets.PasswordInput(attrs={"class": "form-control", "id": "yuan"})
)
salary=forms.CharField(label="薪水") def clean_name(self):
val=self.cleaned_data.get("name")
# 二次校验
if val.isdigit():
raise ValidationError("姓名不能是纯数字!")
elif Emp.objects.filter(name=val):
raise ValidationError("该员工已存在!")
else:
return val
综合使用,在satrk组件中的运用:
class BookModelForm(forms.ModelForm):
class Meta:
model=models.Book #指定book表对应的模型类
fields="__all__" #校验所有字段
#定制字段的标签
labels={
'publish':'出版社',
'authors':"作者"
}
#定制字段的对应的错误信息 required是错误名
error_messages={
"title":{"required":'该字段不能为空'}
}
#定制字段生成的标签的属性
widgets={
'title':wid.TextInput(attrs={'class':'form-control'}),
'price':wid.NumberInput(attrs={'class':'form-control'}),
'pub_date':wid.DateInput(attrs={'class':'form-control ','type':'date'}),
'publish':wid.Select(attrs={'class':'form-control'}),
'authors':wid.SelectMultiple(attrs={'class':'form-control'})
}
#自定义钩子 显示不同的错误信息
def clean_title(self):
val = self.cleaned_data.get("title")
if not val.isdigit():
return val
else:
raise ValidationError("书名不能是纯数字")
示例
def change_view(self,request,id):
change_obj = self.model.objects.filter(pk=id).first()
#获取到自己的定义的ModelForm类的类名
DetialModelForm = self.get_model_form_class()
if request.method=='GET':
form = DetialModelForm(instance=change_obj)
return render(request,'stark/change_view.html',{"form":form})
else:
form = DetialModelForm(request.POST,instance=change_obj)
if form.is_valid():
#校验通过,保存数据
form.save()
return redirect(self.get_list_url())
else:
return render(request, 'stark/change_view.html', {"form": form})
示例 sites.py
django之ModelForm的用法的更多相关文章
- Django 四——ModelForm用法
内容概要: 1.新增数据库表中数据 2.更新数据库表中数据 Django的ModelForm Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分 ...
- Django之ModelForm
简介 Model + Form ==> ModelForm.model和form的结合体,所以有以下功能: 验证 数据库操作 Form回顾 models.py class UserType(mo ...
- 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之缓存的用法, 文件形式与 redis的基本使用
django的缓存的用法讲解 1. django缓存: 缓存的机制出现主要是缓解了数据库的压力而存在的 2. 动态网站中,用户的请求都会去数据库中进行相应的操作,缓存的出现是提高了网站的并发量 3. ...
- django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息
django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...
- Django(十四)课程机构列表页数据展示,Django的modelform,关于urls的重新分发
关于urls的重新分发: 如果所有url都配置在根路径的urls.py里,会特别多,而且也不易于修改,Django框架里支持urls的重新分发: 1.在根路径的urls配置上: PS:namespac ...
- 【django之modelform】
一.什么是modelform ModelForm顾名思义就Form和Django的Model数据库模型结合体,可以简单.方便得对数据库进行增加.编辑操作和验证标签的生成: 举例说明: 比如我们的数据库 ...
随机推荐
- js之prototype 原型对象
原型对象prototype可以这么理解,是该类的实例对象的模板,每个实例对象都是先复制一份该类的prototype,通过这个可以让类的实例拥有相同的功能 String.prototype.say= ...
- Oracle——trunc()函数的使用
trunc是oracle数据库中一种格式化函数. 1.处理日期 1.1.当年第一天: SELECT TRUNC(SYSDATE,'YYYY') FROM DUAL; SELECT TRUNC(SYSD ...
- 【Go语言】基本的语法
昨天花了几个小时的时间把Go的语法过了一遍,发现Go语言的语法核心和大部分编程语言的规则还是挺相近的,差别的就是不同的书写规范.还有就是前天安装VScode编译器那个插件把人弄得恶心了,总是安装不成功 ...
- [macOS] PHP双版本,5.6跟7.1
转过来的,原文看这里,https://www.symfony.fi/page/how-to-run-both-php-5-6-and-php-7-x-with-homebrew-on-os-x-wit ...
- SpringMvc CharacterEncodingFilter 解析 encoding 参数并初始化参数
SpringMvc CharacterEncodingFilter 解析 encoding 参数并初始化参数:
- nor flash与nand flash启动的简单比较--APPLE的ARM学习笔记一
2010-10-08 22:26:00 A,nor flash与nand flash的一些区别 1)接口区别: NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来. NAND Fla ...
- JS设计模式(3)代理模式
什么是代理模式? 情景:小明追女生 A 非代理模式:小明 =花=> 女生A 代理模式:小明 =花=> 让女生A的好友B帮忙 =花=> 女生A 定义:为其他对象提供一种代理以控制对这个 ...
- centos7 install nginx+fastdfs
说明:centos7单机部署 nginx fastdfs ## 创建一下目录作为存储数据图片的路径 可以自己定义 mkdir -pv /data/application/{storage,tracke ...
- Bootstrap3基础 text-uppercase/lowercase/capitalize 字母大写、小写和首字母大写
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- POJ 1390 Blocks(DP + 思维)题解
题意:有一排颜色的球,每次选择一个球消去,那么这个球所在的同颜色的整段都消去(和消消乐同理),若消去k个,那么得分k*k,问你消完所有球最大得分 思路:显然这里我们直接用二位数组设区间DP行不通,我们 ...