Django ModelForm

Django的ModelForm的验证方式相比较form + Model的验证方式有下列区别:

  • ModelForm没有form + Model的低耦合性
  • ModelForm更适合小型项目,而form + Model则无此限制
  • 都是继承BaseForm类,因此也能使用BaseForm中的三个内置钩子

一、ModelForm简单示例:

1、进行modelForm实例之前先在models中创建两张表

from django.db import models

# Create your models here.

class UserType(models.Model):
caption = models.CharField(max_length=32) class UserInfo(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField()
user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE)

2、在form.py中创建ModelForm

from app01 import models
from django import forms
from django.forms import fields class UserInfoModelForm(forms.ModelForm): #还是在forms里面,需要继承modelform class Meta:
model = models.UserInfo #表示去哪一个类里面去获取字段
fields = '__all__' #能获取字段,也可以对这张表进行增删改查,all表示展示所有列
#fields = ['username',] #只选择username列,这个是UserInfo中的字段
#exclude = ["username"] #排除username字段,展示其他字段

3、在view.py中设置验证函数

def index(request):
if request.method == "GET":
obj = UserInfoModelForm() #验证时,创建modelform对象
return render(request,'index.html',{'obj':obj})
elif request.method == "POST":
obj = UserInfoModelForm(request.POST) #在views函数里面做校验
return render(request,'index.html',{'obj':obj})

4、templas中的HTML模板设置

<body>
<form>
{{ obj.as_p }}
<input type="submit" value="提交"/>
</form>
</body>

二、ModelForm中的内置组件、数据保存、示例

1、ModelForm除modle、fields、exclude组件外,其他组件介绍:

ModelForm
class Meta:
model, # 对应Model的
fields=None, # 字段
exclude=None, # 排除字段
labels=None, # 提示标签设置
"""
labels = {
'username':'用户名',
'email':'邮箱',
}
"""
help_texts=None, # 输入框后的帮助提示信息
"""
help_texts = {
'username':'....',
'email':'xxx@126.com',
} """
widgets=None, # 自定义插件
"""
from django.forms import widgets as Fwidgets #需要导入html插件,并且需要重新命名,因为跟关键字重复了 #html插件
widgets = {
"username":Fwidgets.Textarea(attrs={'class':'c1'}) #加上属性
}
"""
error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
"""
error_messages = {
"__all__":{
#定义整体的错误信息
},
'email':{
'required':'邮箱不为空', # 根据required是code值
'invalid':"邮箱格式错误"
}
}
"""
field_classes=None # 自定义字段类 (也可以自定义字段)
"""
#把标签的格式转换为其他格式,这边需要导入fields,但是需要重新起一个别名不然会跟自身的fields冲突,就会报错
from django.forms import fields as Ffields #导入fields,并且取一个别名
field_classes = {
'email':Ffields.URLField #把email格式转换为url格式
}
"""
localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据
"""
如:
数据库中
2016-12-27 04:10:57
setting中的配置
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
则显示:
2016-12-27 12:10:57
""" # ##自定义字段
"""
#modelform可以自定义一些字段,比如10天免登录,这个东西不需要提交到后台的
class UserInfoModelForm(forms.ModelForm):
#自定义字段
is_rmb = Ffields.CharField(
widget=Fwidgets.CheckboxInput() #modelform可以自定义一些字段,比如10天免登录,这个东西不需要提交给后台的
) class Meta:
model = models.UserInfo fields = "__all__" """

2、models下ForeignKey、ManyToMany的数据保存

 class UserType(models.Model):
caption = models.CharField(max_length=32) class UserGroup(models.Model):
name = models.CharField(max_length=32) class UserInfo(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField()
user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE)
u2g = models.ManyToManyField(UserGroup) #跟上面的UserGroup建立多对多关系

models

#1对1的外键,验证通过后,save()一下,数据就直接可以保存在数据库了
def index(request):
if request.method == "GET":
obj = UserInfoModelForm()
return render(request,'index.html',{'obj':obj})
elif request.method == "POST":
obj = UserInfoModelForm(request.POST)
if obj.is_valid():
obj.save() #验证成功之后,是直接保存在数据库中
"""
form + model中的验证函数
# print(obj.is_valid())
# print(obj.cleaned_data)
# print(obj.errors.as_json())
"""
return render(request,'index.html',{'obj':obj})

ForeignKey

 def index(request):
if request.method == "GET":
obj = UserInfoModelForm()
return render(request,'index.html',{'obj':obj})
elif request.method == "POST":
obj = UserInfoModelForm(request.POST)
if obj.is_valid():
# commit为true时将会同时保存回将UserInfo表和其多对多关系表同时进行保存,为false时什么都不会做,需要自己手动保存UserInfo表和其多对多关系表
obj.save(commit=True) instance = obj.save(commit=False) # 什么保存操作都不回做
instance.save() # 这个不等于obj.save(),它只保存当前这个表数据,不会保存其多对多关系表
obj.save_m2m() # 保存其多对多关系表
return render(request,'index.html',{'obj':obj})

ManyToMany

3、示例

 from app01 import models

 def user_list(request):
li = models.UserInfo.objects.all().select_related('user_type') #select_related 只能是外键,不能是多对多
return render(request,'user_list.html',{'li':li}) def user_edit(request,nid):
if request.method == "GET":
user_obj = models.UserInfo.objects.filter(id=nid).first()
mf = UserInfoModelForm(instance=user_obj) #把对象传进来,在前端就能显示默认值
return render(request,'user_edit.html',{'mf':mf,'nid':nid})
elif request.method == "POST":
user_obj = models.UserInfo.objects.filter(id=nid).first()
mf = UserInfoModelForm(request.POST,instance=user_obj) #我把数据提交过来了,并且我拿到对哪个对象进行更新数据
if mf.is_valid():
mf.save()
else:
print(mf.errors.as_json())
return render(request,'user_edit.html',{'mf':mf,'nid':nid})

view.py

<body>
<ul>
{% for row in li %}
<li>{{ row.username }}-{{ row.user_type.caption }}-<a href="/edit-{{ row.id }}/">编辑</a></li>
{% endfor %}
</ul>
</body>

user_list.html

<body>
<form method="post" action="/edit-{{ nid }}/">
{{ mf.as_p }}
<input type="submit" value="提交"/>
</form>
</body>

user_edit.html

【python】-- Django ModelForm的更多相关文章

  1. 【python】-- Django Form

    Django  Form Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容(自定义样式) 一.F ...

  2. 【python】-- Django ORM(基础)

    Django ORM(基础) Django 框架十分强大,自带数据库操作功能.Django 跟 SQLAchemy 一样,也是通过ORM(Object Relational Mapping,关系对象映 ...

  3. 【python】-- Django

    Django Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sessio ...

  4. 【Python】django安装

    官方下载:https://www.djangoproject.com/download/ 报错 [root@test Django-]# python setup.py install Traceba ...

  5. 【python】-- Django 中间件、缓存、信号

    Django  中间件.缓存.信号 一. Django  中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...

  6. 【python】-- Django ORM(进阶)

    Django ORM(进阶) 上一篇博文简述了Django ORM的单表操作,在本篇博文中主要简述Django ORM的连表操作. 一.一对多:models.ForeignKey() 应用场景:当一张 ...

  7. 【Python】Django

    数据表更改 Django 1.7.x 和后来的版本: Django 1.7.x 及以后的版本集成了 South 的功能,在修改models.py了后运行: python manage.py makem ...

  8. 【Python】Django支持事务方式

    代码: with transaction.atomic(): for i in xrange(int(svc_instance_num)): tmp_fileprotect_svc_instance ...

  9. 【Python】Django 时间字段 最佳实践

    . python datetime from datetime import datetime datetime.now() datetime.utcnow() from datetime impor ...

随机推荐

  1. javascript 和 jquery 博客

    http://www.cnblogs.com/starof/category/626164.html

  2. Maven 命令行创建项目时 Could not find goal ‘create’ in plugin org.apache.maven.plugins:...

    使用maven3.3.9 版本,进行命令行创建项目时输入以下命令创建失败 mvn archetype:create -DgroupId=com.zang.maven  -DartifactId=sys ...

  3. asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(一)—— 手把手教你创建第一个三层架构+mvc的asp.net项目

    下面开启项目 1. 打开vs2010-文件-新建项目 2. 先创建一个空的解决方案: 选择其他项目类型-visual studio 解决方案-空白解决方案(默认.NET Framework 4),项目 ...

  4. Rest API By JAX-RS 实现接口发布

    原文地址:http://www.cnblogs.com/oopsguy/p/7503589.html JAX-RS 我们在 JAX-RS 示例中使用相同的模型和 DAO,我们所需要做的只有更改 Sto ...

  5. Python技术公众号100天了

    公众号100天了,是个值得一提的日子! 我从2017年10月31日开始做这个公众号,到今天2018年2月7日,差不多100天时间 .虽然公众号很早就申请了,但直到去年10月31日,我才有真正把这个公众 ...

  6. RHEL 5.4下部署LVS(DR)+keepalived实现高性能高可用负载均衡(转)

    一.简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. ...

  7. silverlight 对ChildWindow返回给父窗体值的理解(转载)

    这篇文章是我对ChildWindow的理解,举例说明: 有时候在项目中需要弹出子窗体进行一些操作,然后将操作的值返回到父窗体中. 下图是子窗体的界面(比较粗糙....) 下面贴出其代码: 子窗体前台代 ...

  8. Java(Android)解析KML文件

    參考自:http://blog.csdn.net/yyywyr/article/details/38359049 http://blog.csdn.net/warrenwyf/article/deta ...

  9. Dart Essentials(读书笔记)——这本书非常大篇幅都在谈AngularDart,Zones概念没谈到

    Dart Essentials 文件夹 1 Getting Started 2 Practical Dart 3 The Power of HTML5 with Dart 4 Developing a ...

  10. Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27

    Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27 1. 修改历史2 2. 适用语言::几乎所有编程语言.语言提升的三个渠道::语法,类库,框架,ide2 2.1. 单根继承  ...