ModelForm的基本用法:
一、ModelForm的基本用法示例:
from django import forms
from app01 import models
class BookModelForm(forms.ModelForm):
#必须是这个类名
class Meta:
# 告诉Django这个form类和那个model类对应
model = models.Book
# 告诉Django这个form类里面有哪些字段
fields = "__all__"
widgets = {
"publish_date": forms.widgets.DateInput(
# 给日期字段添加日期类型
attrs={"type": "date"}
)
}
labels = {
"title": "书名",
"price": "价格",
"publish_date": '出版日期',
"publisher": "出版社名称",
"authors": "作者"
}
error_messages = {
"title": {
"required": "书名不能为空"
}
}
# 通过修改类的初始化方法达到批量添加共同属性的目的
def __init__(self, *args, **kwargs):
super(BookModelForm, self).__init__(*args, **kwargs)
# for field_name in self.base_fields:
for field in iter(self.fields):
self.fields[field].widget.attrs.update({
'class': 'form-control'
})
ModelForm所有属性:
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',) # 本地化,如:根据不同时区显示数据
ModelForm用于验证用户数据:is_valid()
model_form_obj = XXOOModelForm() //实例化对象
model_form_obj.is_valid() // 校验数据
model_form_obj.errors.as_json() //错误
model_form_obj.clean() //同Form组件中的属性
model_form_obj.cleaned_data // 同Form组件中的属性
ModelForm用于创建数据:save()
def add_book(request):
if request.method == "POST":
#直接传request.POST,进行ModelForm的实例化传参
form_obj = forms.BookModelForm(request.POST)
if form_obj.is_valid(): # 校验数据
form_obj.save() #直接就可以保存数据到数据库,包括多对多,多对一,一对一的关系
return redirect("/book_list/")
#ModelForm实例化对象
form_obj = forms.BookModelForm()
return render(request, "v2/add_book.html", locals())
ModelForm用于初始化:ModelForm(instance=model_obj)
def edit_book(request, pk):
book_obj = models.Book.objects.filter(id=pk).first()
#form_obj通过instance设置初始化的值,例如,图书管理系统中的编辑书籍功能,
#点击编辑后跳转到编辑书籍页面,跳转后需要用要编辑的书籍信息填充页面对应信息。
#不同于Form组件的是,ModelForm直接就可以传实例化的对象,而不需要将对象转化成字典的形式传。
form_obj = forms.BookModelForm(instance=book_obj)
return render(request, "v2/edit_book.html", locals())
ModelForm用于更新 :ModelForm(request.POST, instance=book_obj)
def edit_book(request, pk):
book_obj = models.Book.objects.filter(id=pk).first()
if request.method == "POST":
#修改数据时,直接可以将用户数据包request.POST传进去,
#再传一个要修改的对象的示例,ModelForm就可以自动完成修改数据了。
form_obj = forms.BookModelForm(request.POST, instance=book_obj)
if form_obj.is_valid(): // 数据校验
form_obj.save() // 直接保存
return redirect("/book_list/")
#form_obj通过instance设置初始化的值,例如,图书管理系统中的编辑书籍功能,
#点击编辑后跳转到编辑书籍页面,跳转后需要用要编辑的书籍信息填充页面对应信息。
#不同于Form组件的是,ModelForm直接就可以传实例化的对象,而不需要将对象转化成字典的形式传。
form_obj = forms.BookModelForm(instance=book_obj)
return render(request, "v2/edit_book.html", locals())
二、ModelForm和Form组件的应用场景:
- ModelForm ---- 中小型应用程序。因为ModelForm是依赖于models的。
- Form ------- 大型应用程序
三、通过ModelForm实现的书籍、作者、出版社的管理代码示例:
- 表结构:
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=12)
address = models.TextField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=12)
gender = models.SmallIntegerField(
choices=((0, '女'), (1, '男'), (2, '保密'))
)
age = models.IntegerField()
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2) # 0~999.99
publish_date = models.DateField()
publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE)
authors = models.ManyToManyField(to="Author")
def __str__(self):
return self.title
- ModelForm类:
from django import forms
from app01 import models
class BookModelForm(forms.ModelForm):
class Meta:
# 告诉Django这个form类和那个model类对应
model = models.Book
# 告诉Django这个form类里面有哪些字段
fields = "__all__"
widgets = {
"publish_date": forms.widgets.DateInput(
# 给日期字段添加日期类型
attrs={"type": "date"}
)
}
labels = {
"title": "书名",
"price": "价格",
"publish_date": '出版日期',
"publisher": "出版社名称",
"authors": "作者"
}
error_messages = {
"title": {
"required": "书名不能为空"
}
}
# 通过修改类的初始化方法达到批量添加共同属性的目的
def __init__(self, *args, **kwargs):
super(BookModelForm, self).__init__(*args, **kwargs)
# for field_name in self.base_fields:
for field_name in iter(self.fields):
field = self.base_fields[field_name]
field.widget.attrs.update({
"class": "form-control",
})
- views 视图函数:
from django.shortcuts import render,redirect
from app01 import modelform
from app01 import models
def book_list(request):
book_list = models.Book.objects.all()
return render(request, 'book_list.html', {'book_list': book_list})
def add_book(request):
if request.method == "POST":
# modelform 直接可以将从前端拿到的数据组request.POST
#当参数传给实例化的Modelform
form_obj = modelform.BookModelForm(request.POST)
# 调用is_valid()方法校验数据
if form_obj.is_valid():
# 直接保存到数据库中
form_obj.save()
return redirect("/book_list/")
modelform_obj = modelform.BookModelForm()
return render(request, 'add_book.html', {"modelform_obj": modelform_obj})
def edit_book(request,pk):
book_obj = models.Book.objects.filter(id=pk).first()
if request.method == "POST":
#修改数据时,直接可以将用户数据包request.POST传进去,
#再传一个要修改的对象的示例,ModelForm就可以自动完成修改数据了。
form_obj = modelform.BookModelForm(request.POST, instance=book_obj)
if form_obj.is_valid():
form_obj.save()
return redirect("/book_list/")
# form_obj通过initial设置初始化的值,例如,图书管理系统中的编辑书籍功能,
# 点击编辑后跳转到编辑书籍页面,跳转后需要用要编辑的书籍信息填充页面对应信息。
# 不同于Form组件的是,ModelForm直接就可以传实例化的对象,而不需要将对象转化成字典的形式传。
form_obj = modelform.BookModelForm(instance=book_obj)
#locals()是将本地数据键值对的简写形式
return render(request, "edit_book.html", locals())
- book_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>书籍列表</title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-offset-2">
<a href="/add_book/">添加书籍</a>
<table border="1">
<thead>
<tr>
<th>序号</th>
<th>id</th>
<th>书名</th>
<th>价格</th>
<th>出版日期</th>
<th>出版社</th>
<th>作者</th>
<th>操作</th>
</tr>
</thead>
{% for book in book_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ book.id }}</td>
<td>{{ book.title }}</td>
<td>{{ book.price }}</td>
<td>{{ book.publish_date }}</td>
<td>{{ book.publisher }}</td>
<td>{{ book.authors.all }}</td>
<td>
<a href="/edit_book/{{ book.id }}/">编辑</a>
</td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
</body>
</html>
- add_book.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加书籍</title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-offset-3">
<form role="form" action="" method="post">
{% csrf_token %}
{% for modelform in modelform_obj %}
<p>
{{ modelform.label }}
{{ modelform }}
</p>
{% endfor %}
<button type="submit" class="btn btn-success">提交</button>
</form>
</div>
</div>
</div>
</body>
</html>
- edit_book.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加书籍</title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-offset-3">
<form role="form" action="" method="post">
{% csrf_token %}
{% for filed in form_obj %}
<p>
{{ filed.label }}
{{ filed }}
</p>
{% endfor %}
<button type="submit" class="btn btn-success">提交</button>
</form>
</div>
</div>
</div>
</body>
</html>
四、通过对Form组件和ModelForm的对比
- ModelForm增加了Form组件和对应数据库之间的联系,进而简化了Form类的代码
- ModelForm继承了Form组件中的所有方法的同时,简化了前端获取数据和对应数据库之间的数据对接,不需要在对数据的内容做过多的操作。
五、ModelForm中的骚操作(同Form组件)
- 批量添加样式:
通过重写ModelForm类的init方法来实现。
# 通过修改类的初始化方法达到批量添加共同属性的目的
def __init__(self, *args, **kwargs):
super(BookModelForm, self).__init__(*args, **kwargs)
# for field_name in self.base_fields:
for field in iter(self.fields):
self.fields[field].widget.attrs.update({
'class': 'form-control'
})
ModelForm的基本用法:的更多相关文章
- Django 之restframework1
Restframework 这里先简单的介绍一下restful协议 ----一切皆是资源,操作只是请求方式 基于restful协议的框架有很多Django下的restframework只是其中的一种 ...
- django之ModelForm的用法
概述: ModelForm类是form是组件中Form的一个子类,所以,也是处理表单的,但功能要比Form类强大,而且使用方便. 步骤: 1.自定义一个类,继承ModelForm from djang ...
- Django之路12——form modelform formset modelformset的各种用法
首先上结论: form适用于对单个表单的操作,并且需要对每个字段的验证规则自定义. modelform:适用于对用户提交的单个表单操作,字段可以用model中的表的字段来作为验证规则,适用于快速的 ...
- form modelform formset modelformset的各种用法
form modelform formset modelformset的各种用法 首先上结论: form适用于对单个表单的操作,并且需要对每个字段的验证规则自定义. modelform:适用于对用 ...
- Django 四——ModelForm用法
内容概要: 1.新增数据库表中数据 2.更新数据库表中数据 Django的ModelForm Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分 ...
- ModelForm
这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,对,你没猜错,相信自己的英语水平. 先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一 ...
- 【django之modelform】
一.什么是modelform ModelForm顾名思义就Form和Django的Model数据库模型结合体,可以简单.方便得对数据库进行增加.编辑操作和验证标签的生成: 举例说明: 比如我们的数据库 ...
- Django之ModelForm
简介 Model + Form ==> ModelForm.model和form的结合体,所以有以下功能: 验证 数据库操作 Form回顾 models.py class UserType(mo ...
- Django(九)上:ModelForm操作
一.内容回顾 Model - 数据库操作 - 验证 class A(MOdel): user = email = pwd = Form - class LoginForm(Form): email = ...
随机推荐
- Shell-sed之替换字符
将A_B_C_D_TXT 修改为 A.B_C_D.TXT echo "A_B_C_D_TXT"|sed 's/_/./1;s/_/./3' 注:后面的数字代表匹配的次数, 1表示第 ...
- vulstudy靶机搭建(kali)
安装 安装docker apt-get install docker.io //# 安装docker pip install docker-compose //# 安装docker-compose g ...
- 带你学习Python-基础知识的框架梳理
对于编程初学者来说,在刚刚开始学习Python语言的时候,需要学习的内容有不少,比如计算机原理.网络.Web前端.后端.架构. 数据库都是必须掌握的知识点.因此初学者常常会陷入"只见树木,不 ...
- Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案
内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...
- Ubuntu使用Nginx 部署你的静态网页
首先使用Putty 登录填写名称 unbutu 然后获取管理员权限 sudo -i 首先更新APT库sudo apt-get updatesudo apt-get upgrade 安装 git,su ...
- C#WebApi 接口增加备注和测试 默认api文档
1:配置 接口注释. (1)配置生成xml的路径.我们在项目上面点右键→属性→生成标签页配置xml的路径. (2)在xml的读取路径:在Areas\HelpPage\App_Start\HelpPag ...
- Blogs添加横幅滚动条
#1.定义CSS样式 .box { width: 100%; margin: 0 auto; /* border: 0.2px solid gray; */ overflow: hidden; } . ...
- 管理Windows上的路由表
路由器获取目录帮助手册: route /? 修改路由的时候最高以管理员运行cmd程序 默认路由只是临时生效的,只要管理员禁用在启用网卡,默认路由就消失了(重启计算机默认路由也会消失),可以在后面添加一 ...
- 使用Android Studio来阅读Android源码
在编译android系统后,执行下面命令来生成索引. mmm development/tools/idegen/mv ./out/target/product/tiny4412/obj/GYP/sha ...
- mysql性能调优注意事项
1.最左原则 注意遇到> < like between失效 2.对于like 查询 遇到最左%索引无效 3.SQL性能优化目标:至少要达到range(对索引进行范围查找)级别,要求是 ...