概述:

  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的用法的更多相关文章

  1. Django 四——ModelForm用法

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

  2. Django之ModelForm

    简介 Model + Form ==> ModelForm.model和form的结合体,所以有以下功能: 验证 数据库操作 Form回顾 models.py class UserType(mo ...

  3. Django中ModelForm应用

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

  4. Django的ModelForm

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

  5. Django中Model-Form验证

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

  6. django之缓存的用法, 文件形式与 redis的基本使用

    django的缓存的用法讲解 1. django缓存: 缓存的机制出现主要是缓解了数据库的压力而存在的 2. 动态网站中,用户的请求都会去数据库中进行相应的操作,缓存的出现是提高了网站的并发量 3. ...

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

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

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

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

  9. 【django之modelform】

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

随机推荐

  1. 深入理解Java虚拟机1-chap1-2-斗之气8段

    1.HotSpot VM:热点代码探测能力,与JIT技术共同进行编译优化,输出高质量代码 2.运行时数据区域 程序计数器:控制程序执行顺序,无OOM Java虚拟机栈:生命周期与线程一致,描述Java ...

  2. 强迫症犯了,忍不住赞一下slf4j包Logger.java的优雅代码

    如下是slf4j-api包下的Logger接口类里其中几个方法的声明: package org.slf4j; public interface Logger { /** * Log a message ...

  3. 《linux就该这么学》第九节课:第七章,RAID阵列和LVM逻辑卷技术

    笔记 (借鉴请改动) 7.1.RAID(独立冗余磁盘阵列) 常见的几种RAID:RAID0,RAID1,RAID5,RAID10   raid0  实现写入速度但安全性略低. raid1 实现了速度和 ...

  4. 中文WebFont解决方案Font-Spider(字蛛)

    我们在日常需求中,经常会碰到视觉设计师对某个中文字体效果非常坚持的情况,因为页面是否高大上,字体选择是很重要的一个因素,选择合适的字体可以让页面更优雅.面对这种问题,我们通常以下方式来进行设计还原: ...

  5. Docker 基础 (一)

    为什么要使用 Docker? 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势.首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多. 其次,Doc ...

  6. angular和vue还有jquery的区别

    angularjs简单介绍和特点 首先angular是一个mvc框架, 使用mvc解耦, 采用model, controller以及view的方式去组织代码, 会将一个html页面分成若干个模块, 每 ...

  7. Java并发——Fork/Join框架与ForkJoinPool

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

  8. jmeter如何玩之badboy + jmeter并发性能测试

    今天下班时公司安排了一个同事来对项目做集群性能测试,怀着对性能测试的好奇心,下班后没有着急离开,而是等待 那位同事的到来,然后在旁边学习了下如何使用Badboy和jmeter做性能测试. 1. 软件介 ...

  9. JAVA值传递之基本数据类型和引用数据类型

    #1.基本数据类型值传递 package 经典小Demo.值传递; public class Test { public static void main(String[] args) { int a ...

  10. JavaScript 序列化、转义

    JavaScript  序列化.转义 序列化 // 将对象转换为字符串 JSON.stringify() // 将字符串转换为对象类型 JSON.parse() 转义 // URl中未转义的字符 de ...