概述:

  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. Spring Boot 2.0 新特性和发展方向

    以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...

  2. AngularJs实现全选功能

    html代码 <!-- 数据表格 --> <div class="table-box"> <!--工具栏--> <div class=&q ...

  3. Navicat 远程连接 Oracle11g 数据库报错 No listener 的问题

    1.首先确认已经启动 OracleOraDb11g_home1TNSListener 服务时,仍无法连接:   2.进入计算机系统属性中查看 Oracle 服务端计算机的全名:   3.进入 Orac ...

  4. python使用MySQLdb实现连接数据库Mysql

    python实现连接数据库mysql的步骤: 一.引入MySQLdb 二.获取与数据库的连接 三.执行SQL语句和存储过程 四.关闭数据库连接 1.什么是MySQLdb? MySQLdb是用于pyth ...

  5. 004-mac下Java6与Java8 安装

    一.Java6安装 官方下载下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-down ...

  6. python 容器类型数据 (str list tuple set dict)

    # ###容器类型数据(str list tuple set dict) var1 = "今天心情非常美丽" var2 = [1,2,3,4] var3 = ("黄将用& ...

  7. Python 操作 MySQL 的5种方式(转)

    Python 操作 MySQL 的5种方式 不管你是做数据分析,还是网络爬虫,Web 开发.亦或是机器学习,你都离不开要和数据库打交道,而 MySQL 又是最流行的一种数据库,这篇文章介绍 Pytho ...

  8. Eclipse出现:An internal error occurred during: "Retrieving archetypes:". GC overhead limit exceeded的问题解决

    网上说修改虚拟内存的方式,其实不太可行,最直接的方式就是删除以前的workspace,重新使用一个新的workspace.

  9. C语言进阶之路(一)----C语言的内存四区模型

    内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...

  10. Treap仿set 模板

    Treap仿set 模板 蓝书232 &代码: #include <cstdio> #include <bitset> #include <iostream> ...