1.ModelForm组件介绍:这个组件的功能就是把model和form组合起来

2.ModelForm的使用

1.首先需要导入ModelForm

  from django.forms import ModelForm

2.在视图函数中,定义一个类,比如就叫studyList,这个类要继承ModelForm,在这个类中再写一个原类Meta(规定写法,并注意首字母是大写的)

class studyList(ModelForm):
class Meta:
model = models.study
fields = "__all__"
exclude = None #排除得字段
labels = None #提示信息
help_texts #帮助提示信息
widgets = None #自定义插件
error_messages = None #自定义错误信息
#自定义error_messages得用法
error_messages = {
" name" :{'required':'用户名不能为空'},
" phone" :{'required':'用户名不能为空'},
}
#widgets用法,比如把输入用户名的input框给为Textarea
#首先得导入模块
from django.forms import widgets as wid #因为重名,所以起个别名
widgets = {
"name":wid.Textarea(attrs={"class":"c1"}) #还可以自定义属性
}
#labels,自定义在前端显示的名字     labels= {
"name":"用户名"
}

3.如果想增加一个字段,就在class  Meta 之前写这个字段。然后在url对应的视图函数中实例化这个类,把这个对象传给前端。

def study(request):

    if request.method == 'GET':
study_list = studyList()
return render(request,'study.html',{'study_list':study_list})

4.然后前端只需要     {{study_list.as_p }}   一下,所有的字段就都出来了,可以用as_p显示全部,也可以通过for循环这student_list,拿到的是一个个input框,现在我们就不用as_p,手动把这些input框搞出来,as_p拿到的页面太丑 

首先 for循环这个study_list,拿到study对象,直接在前端打印这个study,是个input框;study.label  ,拿到数据库中每个字段的verbose_name ,如果没有设置这个属性,拿到的默认就是字段名;还可以通过studyerrors.0 拿到错误信息,还有study.field,是拿到每个字段,如果这个字段是多对多字段,还能studyt.field.queryset,拿到所有关联的字段,还能studyt.field.queryset.model,拿到所有关联的字段的类。有了这些,我们就可以通过bootstrap,自己拼出来想要的样式了 

<body>
<div class="container" >
<h1>study</h1>
<form method="POST" novalidate>
{% csrf_token %}
{# {{ study_list.as_p }}#}
{% for study in study_list %}
<div class="form-group col-md-6">
{# 拿到数据字段的verbose_name,没有就默认显示字段名 #}
<label class="col-md-3 control-label">{{study.label }}</label>
<div class="col-md-9" style="position: relative;">{{ study }}</div>
</div>
{% endfor %} <div class="col-md-2 col-md-offset-10">
<input type="submit" value="提交" class="btn-primary">
</div>
</form>
</div>
</body>

  现在还缺一个input框的form-control样式,可以考虑在后台的widget里面添加。

from django.forms import widgets as wid  #因为重名,所以起个别名
widgets = {
"name":wid.TextInput(attrs={'class':'form-control'}),
"age":wid.NumberInput(attrs={'class':'form-control'}),
"email":wid.EmailInput(attrs={'class':'form-control'})
}

当然也可以在js中,找到所有的input框,加上这个样式,也行。

保存数据的时候,不用挨个取数据了,只需要save一下。

 1 def study(request):
2
3 if request.method == 'GET':
4 study_list = studyList()
5 return render(request,'study.html',{'study_list':study_list})
6 else:
7 study_list = studyList(request.POST)
8 if studyt_list.is_valid():
9 study_list.save()
10 return redirect(request,'study_list.html',{'study_list':study_list})

5.如果不用ModelForm,编辑的时候得显示之前的数据吧,还得挨个取一遍值,如果ModelForm,只需要加一个instance=obj(obj是要修改的数据库的一条数据的对象)就可以得到同样的效果。

保存的时候要注意,一定要注意有这个对象(instance=obj),否则不知道更新哪一个数据

from django.shortcuts import render,HttpResponse,redirect
from django.forms import ModelForm
# Create your views here.
from app01 import models def test(request): # model_form = models.Study
model_form = models.Study.objects.all()
return render(request,'test.html',{'model_form':model_form}) class StudyList(ModelForm):
class Meta:
model = models.Study #对应的Model中的类
fields = "__all__" #字段,如果是__all__,就是表示列出所有的字段
exclude = None #排除的字段
labels = None #提示信息
help_texts = None #帮助提示信息
widgets = None #自定义插件
error_messages = None #自定义错误信息
#error_messages用法:
error_messages = {
'name':{'required':"用户名不能为空",},
'phone':{'required':"手机号不能为空",},
} #widgets用法,比如把输入用户名的input框给为Textarea
#首先得导入模块
from django.forms import widgets as wid #因为重名,所以起个别名
widgets = {
"name":wid.Textarea
}
#labels,自定义在前端显示的名字
labels= {
"name":"用户名"
}
def study(request): if request.method == 'GET':
studyt_list = StudytList()
return render(request,'study.html',{'study_list':study_list})
else:
study_list = StudyList(request.POST)
if studyt_list.is_valid():
study_list.save()
return render(request,'studyt.html',{'study_list':study_list}) def studyt_edit(request,pk):
obj = models.Study.objects.filter(pk=pk).first()
if not obj:
return redirect('test')
if request.method == "GET":
study_list = StudytList(instance=obj)
return render(request,'studyt_edit.html',{'study_list':study_list}) else:
study_list = StudyList(request.POST,instance=obj)
if studyt_list.is_valid():
study_list.save()
return render(request,'study_edit.html',{'study_list':studyt_list})

6.ModelForm还支持所有form的功能,比如钩子,所以我们就可以通过钩子来自定义验证规则

class AuthorForm(forms.ModelForm):
class Meta:
model = Author
fields = ('name', 'title') def clean_name(self):
if ...
return self.clean_data['name']
else:
raise ValidationError(‘sdgsadga’)
...

Django中ModelForm详解的更多相关文章

  1. django中模型详解-字段类型与约束条件

    这片博文来详细说明django模型的使用,涉及到django模型的创建,字段介绍,以及django模型的crud操作,以及一对一等操作. 在使用模型之前,我们首先设置数据库选项,django的默认数据 ...

  2. Django之ModelForm详解

    前言 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来.先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱 ...

  3. python3与django中@property详解

    django提供了内置装饰器 @staticmethod\@classmethod\property 在OSQA中,@property的使用频率是非常高的.下面就是它的使用方法: @property ...

  4. Django入门基础详解

    本次使用django版本2.1.2 安装django 安装最新版本 pip install django 安装指定版本 pip install django==1.10.1 查看本机django版本 ...

  5. 第五篇Django URL name 详解

    Django URL name 详解 利用Django开发网站,可以设计出非常优美的url规则,如果url的匹配规则(包含正则表达式)组织得比较好,view的结构就会比较清晰,比较容易维护. Djan ...

  6. winxp计算机管理中服务详解

    winxp计算机管理中服务详解01 http://blog.sina.com.cn/s/blog_60f923b50100efy9.html http://blog.sina.com.cn/s/blo ...

  7. cocos2dx常见的46中+22中动作详解

    cocos2dx常见的46中+22中动作详解 分类: iOS2013-10-16 00:44 1429人阅读 评论(0) 收藏 举报 bool HelloWorld::init(){    ///// ...

  8. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  9. iOS中-Qutarz2D详解及使用

    在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...

随机推荐

  1. 联发科Mediatek工业路由芯片上网稳定低功耗的Router模块WiFi中继——无线AP定制方案

    Router模块又名路由器模块,是指将路由器的接口类型及部分扩展功能是可以根据实际需求来进行无线接入服务,允许其他无线设备接入,通过局域无线端或联网远程端,进行数据访问,对无线设备进行远程控制.常见的 ...

  2. uniapp微信小程序分享

    触发代码 如: <button open-type="share">分享</button> 在JS中 分享进入页面传参,和微信小程序路由传参的思路是一样的. ...

  3. python爬虫05正则表达式

    字符 描述 \ 将下一个字符标记为一个特殊字符(File Format Escape,清单见本表).或一个原义字符(Identity Escape,有^$()*+?.[\{|共计12个).或一个向后引 ...

  4. 解决Python参考文档乱码问题

    问题如下: 解决方案: 打开IE浏览器,随便输入一个网址,在页面空白处点击右键->编码->自动选择 再次重新开启python3 帮助文档即可

  5. Java并发原理层面:ReentrantLock中lock()、unlock()全解析

    一.前言 Java线程同步两种方式,synchronized关键字和Lock锁机制,其中,AQS队列就是Lock锁实现公平加锁的底层支持. 二.AQS源码对于lock.lock()的实现 2.1 AQ ...

  6. C++ 基础 1:C++ 对 C 语言的增强

    1 namespace 命名空间 1.1 C++ 命名空间的定义 C++标准 引入了关键字 namespace(命名空间),可以更好地控制标识符的作用域. namespace name { ... } ...

  7. 执行 yarn init报错,如何解决?

    安装yarn以后执行yarn init 命令来初始化项目 报错如下所示: 解决方法: 1.先用npm init初始化项目 在初始化的最后一步 is this ok(yes)? 输入yes回车后,可能会 ...

  8. git clone 出现"error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received."

    1. 最近用git pull几个大项目,总是报如下错误: error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with un ...

  9. JNI-从jvm源码分析Thread.interrupt的系统级别线程打断原理

    前言 在java编程中,我们经常会调用Thread.sleep()方法使得线程停止运行一段时间,而Thread类中也提供了interrupt方法供我们去主动打断一个线程.那么线程挂起和打断的本质究竟是 ...

  10. javascript链式运动框架案例

    javascript链式运动框架 任务描述: 当鼠标移入红色矩形时,该矩形宽度逐渐增加至400px,之后高度逐渐增加至400px; 当鼠标移出红色矩形时,该矩形高度逐渐减小至200px,之后宽度逐渐减 ...