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 ...
随机推荐
- C++之Effective STL学习笔记Item21
好了,先贴一段英文,真心不想翻译过来,而且感觉也翻译不到那么到位: The STL is awash in comparisons of objects to see if they have the ...
- jQuery全屏滚动插件fullPage.js使用中遇到的问题(滑动轮播效果无效)
1.fullPage.js是什么? fullPage.js 是一个基于 jQuery ,用来制作全屏网站的插件. 2.兼容性: - jquery兼容:兼容 jQuery 1.7+ - 浏览器兼容: I ...
- UVA12206 Stammering Aliens 【SAM 或 二分 + hash】
题意 求一个串中出现至少m次的子串的最大长度,对于最大长度,求出最大的左端点 题解 本来想练哈希的,没忍住就写了一个SAM SAM拿来做就很裸了 只要检查每个节点的right集合大小是否不小于m,然后 ...
- POJ2594Treasure Exploration(最小路径覆盖,相交)
Treasure Exploration Have you ever read any book about treasure exploration? Have you ever see any f ...
- hdu 4602 递推关系矩阵快速幂模
Partition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- The disk contains an unclean file system
Ubuntu : Status 14: The disk contains an unclean file system By mkyong | July 23, 2014 | Viewed : 10 ...
- 【leetcode】Find All Anagrams in a String
[leetcode]438. Find All Anagrams in a String Given a string s and a non-empty string p, find all the ...
- yii 数据库添加,修改,删除相关操作总结
yii中关于数据信息的添加数据,修改数据,删除数据的相关操作,刚刚学习没几天,仅记录了一些,以后慢慢再充实,有需要的朋友可以看看. 添加数据的方法 (1)save 方法(对象形式操作) $user=n ...
- Tomcat是怎么工作的(2) -- 动手实现山寨版的简单Web Server
本文先讲解一下Java web server都是怎么工作的.web server也叫HTTP server——顾名思义它是用HTTP协议和客户端交互的.客户端一般就是各种各样的浏览器了.相信所有朋友都 ...
- iOS-tableView上拉加载更多后,界面出现偏移
问题描述: 在做tableview的界面展示的时候,cell用自动计算高度的.但是在上拉加载更多的时候,数据请求完后,刷新界面,界面的顶部就出现了偏移 分析: 查阅资料后发现,当tableView的c ...