Django 的 model form 组件
Django 的 model form 组件
Model Form 组件的由来
之前介绍过 Django 的 Form 组件(Django的Form表单)使用方法,Form 组件能够帮我们做三件事:
生成页面可用的HTML标签
对用户提交的数据进行校验
保留上次输入内容
我们发现,form 类中的字段和 model 类中的字段及其相似,但 form 表单和 model 类并没有什么关系。对于每一个 model 类,我们都需要为其创建一个对应的 form 类,还要根据该 model 类定义校验。
这种方式增添了很多重复劳动,所以出现了 model form 组件,它可以优雅地生成 form 类,并且在校验方面更简单。
创建 model form
要用到的 model 类有:
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="价格")
date = models.DateField()
publish = models.ForeignKey(to="Publish")
authors = models.ManyToManyField(to="Author")
def __str__(self):
return self.title
class Publish(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name
直接在视图层中创建 model form
# views.py
# 导入 ModelForm
from django.forms import ModelForm
from django.forms import widgets as wid # 避免重名
class Book(ModelForm):
class Meta:
# 对应的Model类
model = models.Book
# 字段,all表示列出所有字段
fields = "__all__"
# labels 自定义显示的名字,
labels = {
"title": "书名",
"publish": "出版社",
"date": "出版日期",
"authors": "作者",
}
# error_messages用法:
error_messages = {
'title': {'required': "书名不能为空", },
'date': {'required': "出版日期不能为空", },
}
widgets = {
"title": wid.TextInput(attrs={"class": "form-control"}),
"date": wid.TextInput(attrs={"type": "date"})
}
展示数据
视图函数中的使用
在视图函数中将该类实例化并传到前端。
def book(request):
book_list = models.Book.objects.all()
# book = Book()
return render(request, 'book.html', locals())
模板中的使用
前端只需要 {{book_list.as_p }} 一下,所有的字段就都出来了,可以用 as_p 显示全部,也可以通过 for 循环这 book_list ,拿到的是一个个 input 框,这种方法支持加 class 样式类。
<table border="1">
{% for book in book_list %}
<tr>
<td>{{ book.title }}</td>
<td>{{ book.price }}</td>
<td>{{ book.date|date:"Y-m-d" }}</td>
<td>{{ book.publish.name }}</td>
<td>
{% for author in book.authors.all %}
{{ author.name }}
{% endfor %}
</td>
<td><a href="/book/edit/{{book.pk}}"><button>编辑</button></a></td>
</tr>
{% endfor %}
</table>
在后台给在前端显示的字段加属性。
widgets = {
"title": wid.TextInput(attrs={"class": "form-control"}),
"date": wid.TextInput(attrs={"type": "date"})
}
添加数据
视图函数中的使用
使用 model form 类在添加时变的十分简单,通过 request.POST 创建一个 Book 对象,判断其是否通过验证,如果通过验证,只需简单的 book.save() 就能保存到数据库中。
def add_book(request):
if request.method == "POST":
book = Book(request.POST)
if book.is_valid():
book.save()
return redirect('/book/')
book = Book()
return render(request, 'add.html', locals())
模板中的使用
模板中的使用与上面的相同。
<form action="" method="post" novalidate>
{% csrf_token %}
{# 一个as_p就能将所有HTML标签自动加上#}
{{ book.as_p }}
<input type="submit" value="提交">
</form>
编辑数据
视图函数中的使用
在编辑功能中我们希望编辑页面能显示原来的数据,用 model form 类很容易就能实现。
根据要编辑书籍的 id 值取出相应的书籍对象并加上 instance 字段用该对象创建 Book 实例对象,即可实现。
def edit_book(request, id):
book_obj = models.Book.objects.filter(pk=id).first()
if not book_obj:
return HttpResponse("无该书籍")
if request.method == "POST":
book = Book(request.POST, instance=book_obj)
if book.is_valid():
book.save()
return redirect('/book/')
book = Book(instance=book_obj)
return render(request, 'edit.html', locals())
模板中的使用
模板中的使用与上面的相同。
<form action="" method="post" novalidate>
{% csrf_token %}
{# 一个as_p就能将所有HTML标签自动加上#}
{{ book.as_p }}
<input type="submit" value="提交">
</form>
GitHub 地址:https://github.com/protea-ban/oldboy/tree/master/9day84

Django 的 model form 组件的更多相关文章
- Django的model form组件
前言 首先对于form组件通过全面的博客介绍,对于form我们应该知道了它的大致用法,这里我们需要明确的一点是,我们定义的form与model其实没有什么关系,只是在逻辑上定义form的时候字段名期的 ...
- python3-开发进阶Django-form组件中model form组件
Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样 ...
- Django中的form组件
Django中的form组件有两大作用 1.验证获取正确的结果或者错误信息 2.生成html代码 一.为什么需要form组件呢? 在写form表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...
- Django框架 之 form组件
Django框架 之 form组件 浏览目录 Form介绍 普通的登录 使用form组件 Form详情 常用字段 校验 进阶 使用Django Form流程 一.Form介绍 我们之前在HTML页面中 ...
- Django框架11 /form组件、modelForm组件
Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...
- Django框架 之 form组件的钩子
Django框架 之 form组件的钩子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3 ...
- 14 Django之Form和Model Form组件
一.什么是Form 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用 ...
- django补充和form组件
Model常用操作: - 参数:filter - all,values,values_list [obj(id,name,pwd,email),obj(id,name,pwd,email),] mod ...
- Python开发【Django】:Form组件
Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...
随机推荐
- LAMP 2.7 Apache通过rewrite限制某个目录
我们可以 allow 和 deny 去现在网站根目录下的某个子目录,当然这个 rewrite 也可以实现,配置如下: 创建一个目录和文件随便写些东西 mkdir /data/www/data/tmp ...
- C语言学习笔记--#和##操作符
1. #运算符 (1)#运算符用于在预处理期将宏的参数转换为字符串 (2)#的转换作用是在预处理期完成的,因此只在宏定义中有效,即其他地方不能用#运算符 (3)用法:#define STRING(x) ...
- Android Studio 搭配 Tortoise SVN 安装问题汇总
(1)Android studio 中想要使用SVN,但是在安装 1.9版本的SVN,会报SVN is too old(实际是太新了)的错误.所以只能下载1.8以下版本 (2)安装svn时,需要手动选 ...
- springmvc 中异常处理
springmvc 中异常处理常见三种处理方式: 1:SimpleMappingExceptionResolver处理的是处理器方法里面出现的异常 2 3.自定义异常处理器:处理的是处理器方法里面出现 ...
- alias这个命令还是很有用的
这是在知乎看到的一个回答. 我一开始学习linux命令的时候觉得这个alias命令很奇怪,为什么要给别人起个别名呢?有什么好处? 因为当时接触的是比较简单的命令 比如ls -al的这种短小的命令,对a ...
- chrome headless
最近才知道有这么个东西,说白了就是chrome浏览器的命令行模式,一说到命令行自然就和自动化 高效率有关系,感觉对于自动化测试和爬虫很有用啊
- java开发中用到的技术(持续更新.....)
一.数据库 1.数据库连接池:当jdbc连接数据库使用DriverManager 获取时,每次向数据库建立连接的时候都要讲connection加载到内存中,当同时使用的用户数量较大时,会造成服务器不堪 ...
- elasticsearch 6.2.4 安装 elasticsearch-analysis-ik 分词器 (windows 10下)
访问 https://github.com/medcl/elasticsearch-analysis-ik 找 releases 找到对应的 es 版本 下载 elasticsearch-analy ...
- GCD 学习(三)Main&Global Dispatch Queue
摘录自:http://zhuyanfeng.com/archives/3066 Main Dispatch Queue是在主线程中执行任务的Dispatch Queue.因为主线程只有1个,所以Mai ...
- ARC100C Linear Approximation
传送门 分析 这道题真的好水呀QwQ,想必大家都知道对于式子|x-2|+|x-3|x取什么值可以使式子结果最小,这道题也是这个原理,只需要将要额外减的1.2.3……提前减掉就行了. 代码 #inclu ...