Django-model_form
ModelForm
a. class Meta:
model, # 对应Model的
fields=None, # 字段
exclude=None, # 排除字段
labels=None, # 提示信息
help_texts=None, # 帮助提示信息
widgets=None, # 自定义插件
error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
field_classes=None # 自定义字段类 (也可以自定义字段)
localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据
如:
数据库中
2016-12-27 04:10:57
setting中的配置
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
则显示:
2016-12-27 12:10:57
b. 验证执行过程
is_valid -> full_clean -> 钩子 -> 整体错误 c. 字典字段验证
def clean_字段名(self):
# 可以抛出异常
# from django.core.exceptions import ValidationError
return "新值"
d. 用于验证
model_form_obj = XXOOModelForm()
model_form_obj.is_valid()
model_form_obj.errors.as_json()
model_form_obj.clean()
model_form_obj.cleaned_data
e. 用于创建
model_form_obj = XXOOModelForm(request.POST)
#### 页面显示,并提交 #####
# 默认保存多对多
obj = form.save(commit=True)
# 不做任何操作,内部定义 save_m2m(用于保存多对多)
obj = form.save(commit=False)
obj.save() # 保存单表信息
obj.save_m2m() # 保存关联多对多信息 f. 用于更新和初始化
obj = model.tb.objects.get(id=1)
model_form_obj = XXOOModelForm(request.POST,instance=obj)
... PS: 单纯初始化
model_form_obj = XXOOModelForm(initial={...})
应用场景:
- ModelForm - 中小型应用程序。因为ModelForm是依赖于models的
- Form - 大型应用程序 *
注意事项:
- 1. 类
class Foo(ModelForm):
class Meta:
# model = models.Role
# fields = "__all__"
# fields = ['caption',]
# exclude = ['catpion']
model = models.UserType
fields = "__all__" error_messages = {
'title':{'required':'名称不能为空','invalid':'格式错误'}
}
widgets = {
'title':wd.TextInput(attrs={'class':'c1'})
} - 2. 添加
GET:
form = Foo()
POST:
form = Foo(data=request.POST)
form.is_valid()
form.cleaned_data
form.erros
form.save()
- 3. 修改
GET:
form = Foo(instance=obj) POST:
form = Foo(instance=obj,dat=request.POST)
...
form.save()
表结构:
from django.db import models # Create your models here.
class UserInfo (models.Model):
username = models.CharField(max_length=32)
email = models.EmailField(max_length=32)
ut = models.ForeignKey("UserType") class UserType (models.Model):
title = models.CharField(max_length=32)
roles = models.ManyToManyField(to="Roles")
def __str__(self):
return self.title class Roles(models.Model):
caption = models.CharField(max_length=32)
def __str__(self):
return self.caption
基于modelform的操作
单表添加操作
# 基于ModelForm的添加
class RoleModelForm(ModelForm):
class Meta: #这个类必须写,而且名字必须是这个
model = models.Roles #这个model也是固定的,注意不加s,
fields = "__all__" #代表所有的字段,但是你也可以指定单个的字段 def role_add(request):
if request.method == "GET":
form = RoleModelForm()
return render(request,"role_add.html",{"form":form})
else:
form = RoleModelForm(data=request.POST)
if form.is_valid():
form.save() #这里直接可以用save方法,就把数据创建了
return redirect("/role/")
else:
return render(request,"role_add.html",{"form":form})
多表添加操作:
# 多对多的添加
def usertype(request):
user_type_list = models.UserType.objects.all()
return render(request,"usertype.html",{'user_type_list':user_type_list}) class UserTypeModelForm(ModelForm):
title = fields.CharField(max_length=6,required=True,widget=widgets.Textarea) #这个字段是临时添加的,
# 也就是说modelForm也可以用Form的方式。
# 也可以以这样的方式新增字段, 如果有就覆盖,没有就增加;像现在这种情况就是吧下面的给覆盖了,当然没有上面的这个就用下面的了 class Meta:
model = models.UserType
fields = "__all__" error_messages = {
"title":{"required":"用户名不能为空","invalid":"邮箱格式不一致"}
}
widgets = {
"title":widgets.TextInput(attrs={"class":"c1"})
} def usertype_add(request):
'''多对多的添加'''
if request.method=="GET":
modelform = UserTypeModelForm()
return render(request,"usertype_add.html",{"modelform":modelform})
else:
modelform = UserTypeModelForm(data=request.POST)
if modelform.is_valid():
modelform.save() #也可以用save来实现,就连关系表的字段也都添加了
return redirect("/usertype/")
else:
return render(request, "usertype_add.html", {"modelform": modelform})
单表的编辑
# 基于modelForm实现的编辑
def role_edit(request,nid):
obj = models.Roles.objects.filter(id=nid).first()
if not obj :
return HttpResponse("页面不存在")
if request.method=="GET":
form = RoleModelForm(instance=obj) #编辑的时候需要一个instance,让instance=一个你要编辑的那个对象
else:
form = RoleModelForm(data = request.POST,instance=obj)
if form.is_valid:
form.save()
return redirect("/role/")
return render(request,"role_edit.html",{"form":form})
多表的编辑操作
# 多对多的编辑
def usertype(request):
user_type_list = models.UserType.objects.all()
return render(request,"usertype.html",{'user_type_list':user_type_list}) class UserTypeModelForm(ModelForm):
title = fields.CharField(max_length=6,required=True,widget=widgets.Textarea) #这个字段是临时添加的,
# 也就是说modelForm也可以用Form的方式。
# 也可以以这样的方式新增字段, 如果有就覆盖,没有就增加;像现在这种情况就是吧下面的给覆盖了,当然没有上面的这个就用下面的了 class Meta:
model = models.UserType
fields = "__all__" error_messages = {
"title":{"required":"用户名不能为空","invalid":"邮箱格式不一致"}
}
widgets = {
"title":widgets.TextInput(attrs={"class":"c1"})
} def usertype_edit(request,nid):
#查出当前类型用户对应的角色
obj = models.UserType.objects.filter(id =nid).first()
if not obj:
return HttpResponse("页面不存在")
if request.method =="GET":
form = UserTypeModelForm(instance=obj)
return render(request,"usertype_edit.html",{"form":form})
else:
form = UserTypeModelForm(instance=obj,data=request.POST)
if form.is_valid():
form.save()
return redirect("/usertype/")
return render(request,"usertype_edit.html",{"form":form})
Django-model_form的更多相关文章
- Django models Form model_form 关系及区别
Django models Form model_form
- django xadmin 插件(3) 列表视图新增自定义按钮
效果图: 编辑按钮是默认的list_editable属性对应的插件(xadmin.plugins.editable) 放大按钮对应的是自定义插件. 自定义按钮源码: xplugin.py(保证能够直接 ...
- Django的ModelForm
基于django.forms.ModelForm:与模型类绑定的Form 先定义一个ModelForm类,继承ModelForm类 from django.forms import ModelForm ...
- 【django之modelform】
一.什么是modelform ModelForm顾名思义就Form和Django的Model数据库模型结合体,可以简单.方便得对数据库进行增加.编辑操作和验证标签的生成: 举例说明: 比如我们的数据库 ...
- django捡破烂
一 Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库 ...
- Django之 Form和ModelForm组件
01-Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用 ...
- Django中Model-Form验证
Django中Model-Form验证 class UserType(models.Model): caption=models.CharField(max_length=32) class User ...
- Django的model form组件
前言 首先对于form组件通过全面的博客介绍,对于form我们应该知道了它的大致用法,这里我们需要明确的一点是,我们定义的form与model其实没有什么关系,只是在逻辑上定义form的时候字段名期的 ...
- Django之stark组件
现在让我说啥是stark组件,我也说不清楚.反正从今天讲的知识来看,今天完成的就是自己写一个模块,这个模块包含了admin后台管理工具的一些比较好用的功能,我们把它提炼出来,也就是相当于自己写一个ad ...
- Django知识补充
目录 一.文件上传 二.Models补充 三.Django总结 一.文件上传 1.通过form表单或者通过From类上传 views.py from django.shortcuts import r ...
随机推荐
- 【bzoj3513】[MUTC2013]idiots FFT
题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...
- CORS跨域请求总结
CORS跨域请求分为简单请求和复杂请求. 1. 简单请求: 满足一下两个条件的请求. (1) 请求方法是以下三种方法之一: HEAD GET POST (2)HTTP的头信息不超出以下几种字段: Ac ...
- 我最喜欢的XML(三种方式)
我最喜欢的方式 下面的三个 XML 文档包含完全相同的信息: 第一个例子中使用了 date 属性: <note date="08/08/2008"> <to> ...
- [暑假集训--数位dp]cf55D Beautiful numbers
Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer numb ...
- bzoj 1857 三分套三分
题目大意 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...
- net7:Web用户控件ascx的使用及其动态加载
原文发布时间为:2008-07-30 -- 来源于本人的百度文章 [由搬家工具导入] Web用户控件test.ascx的源代码: using System;using System;using Sys ...
- Chtml的一些例子
<!-- 如果是修改的话,调用已关联的单元 --> <?php foreach ($unionZones as $unit) { echo CHtml::openTag('div', ...
- 如何解决div里面img图片下方有空白的问题?
空白产生原因: 图片默认的vertical-align是baseline,(元素放置在父元素的基线上,也就是xx下边距) 一个inline-block元素,如果里面没有inline元素,或者overf ...
- es6 export、import
一.输出变量 1.export var a = 0; 2.var a = 0'; export {a}; 3.var a =0 ; export {a as rename}; //使用as重命名的对外 ...
- Latex algorithm
方式一 需要包含的 \usepackage[noend]{algpseudocode} \usepackage{algorithmicx,algorithm} 源码 \begin{algorithm} ...