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. Java学习的第三十一天

    1.使用RandomAccessFile随机读写文件 2.没有问题 3.明天学习综合实例

  2. 关于Linux操作系统的文件管理与常用命令

    1.显示文件内容命令:cat     more    less      head     tail cat命令 : cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于下的 ...

  3. 分享JDK解压版(ZIP)

    目录 由于安装版本的jdk不太方便,所以我分享一下如何去获取解压版的jdk,jdk配置的话看这个文章 一.先下载exe版本的jdk安装程序: 二.使用7-ZIP解压工具 2.1 JDK8的解压目录 2 ...

  4. Tomcat 总结

    JavaWeb简介 JavaWeb,是用Java技术来解决相关web互联网领域的技术总和. Web包括:web服务器和web客户端两个部分,有两种软件架构 ​ C/S:客户端/服务器端 ​ B/S:浏 ...

  5. c++ templates 第二版(英文)

    关注公众号:红宸笑. 回复:电子书 即可

  6. 细学C++之C++语言的特点

    优点: 1.强大的抽象封装能力:这让C++语言具备了强大的开发工程能力 2.高性能:运行快,并且占用资源少 3.低功耗:适合在各种微型的嵌入式设备中运行高效的程序 缺点: 1.语法相对复杂,细节比较多 ...

  7. 容器场景要选择什么 Linux 版本?

    容器的底层实现深度依赖于内核的众多特性,如 overlay 文件系统,namespace, cgroup 等,因此内核的功能和稳定性,在很大程度上,决定了整个容器PaaS平台的功能和稳定性.从 TKE ...

  8. Serilog 源码解析——解析字符串模板

    大家好啊,上一篇中我们谈到 Serilog 是如何决定日志记录的目的地的,那么从这篇开始,我们着重于 Serilog 是向 Sinks 中记录什么的,这个大功能比较复杂,我尝试再将其再拆分成几个小块方 ...

  9. 解决 cannot resolve 依赖包的问题

    在maven import的时候 报这样的错误 之前也经常碰到这样的错误,通过reimport.清缓存等方法都可以解决.但这次试了好多次都还是这样,查看maven后发现我pom文件里也没写错. 最后是 ...

  10. python_端口扫描

    client.py import socket def get_ip_status(ip, port): sk= socket.socket(socket.AF_INET, socket.SOCK_S ...