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数据库模型结合体,可以简单.方便得对数据库进行增加.编辑操作和验证标签的生成: 举例说明: 比如我们的数据库 ...
随机推荐
- PTA 复数四则运算
本题要求编写程序,计算2个复数的和.差.积.商. 输入格式: 输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部.题目保证C2不为0. 输出格式 ...
- 6.1-uC/OS-III软件定时器
1.软件定时器是 uC/OS 操作系统的一个内核对象,软件定时器是基于时钟节拍和系统管理创建的软件性定时器,理论上可以创建无限多个,但精准度肯定比硬件定时稍逊一筹. 2.软件定时器启动之后是由软件定时 ...
- MySql 创建索引原则
https://blog.csdn.net/csdnones/article/details/50412603 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引 ...
- 用python写多线程
import threading #首先导入threading 模块,这是使用多线程的前提 from time import ctime,sleep def music(func): ): print ...
- Qt 快捷键 复制当前行 向上复制 && 向下复制
网上的答案不一,我的快捷键是默认的配置,未做过修改. 向前复制当前行: Ctrl + Alt + up (向上箭头) 向后复制当前行:Ctrl + Alt + down(向下箭头) 补充一个:Ctrl ...
- C#中Abstract和Virtual(转载)
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
- Python记录10:模块
''' 1. 什么是模块 模块就一系列功能的集合体 模块有三种来源: 1. 内置的模块 2. 第三方的模块:pip install +模块名称 ...
- win7共享打印机和防火墙配置
今天给公司一台Win7电脑连接的打印机做共享.办公司共6台电脑,其中1台是连接了打印机,并安装了打印机驱动,可以正常本机使用打印机.现在需要其他5台电脑也共享使用打印机. 1.当共享的时候,提示“无法 ...
- Zookeeper应用之——选举(Election)
请注意,此篇文章并不是介绍Zookeeper集群内部Leader的选举机制,而是应用程序使用Zookeeper作为选举. 使用Zookeeper进行选举,主要用到了Znode的两个性质: 临时节点(E ...
- spring boot 整合freemarker(好用!!!!)
springboot整合freemarker 1.pom依赖 <!-- 引入freeMarker的依赖包. --> <dependency> <groupId>or ...