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类时,主要涉及到 [ ...
随机推荐
- EF CODEFIRST WITH ORACLE 存储过程
EF CODEFIRST WITH ORACLE 解决存储过程一直没找到解决方案 所以最后也没办法还是用了最基本的解决方案 采用Oracle.ManagedDataAccess提供的ADO基础访问类 ...
- mahout in Action2.2-给用户推荐图书(1)-直观分析和代码
This chapter covers What recommenders are, within Mahout A first look at a recommender in action ...
- SSH简单搭建
本项目使用Struts2+spring3+hibernate3: 第一步:引入jar包,具体需要哪些包根据实际情况加入.注意:把jar包导入后需要对所有包Add to Build Path;然后对工程 ...
- String/StringBuilder 类 用对象数组实现登录注册功能
一.需求说明:实现用户注册.登陆功能: 程序中使用一个长度为3的对象数组,存储用户的登录名和密码: 例如如下格式: 登录名 密码 生日 爱好 zhangsan 11 ...
- (转)C++中使用C代码
昨晚看书的时候碰到一个问题,在C++中如何调用C代码...于是查了一下资料...发现了一个大神写的文章挺好的. -------------------------------------------- ...
- WOJ 43 电话邀请
并查集缩点这个trick感觉明明用得很广泛,为什么以前都不知道…… 先把$m$条线路从小到大排个序,这样可以保证之前合并出来的一定是最小的,大的代价不会把小的覆盖掉. 维护两个并查集,一个用来缩点,另 ...
- input与字符串格式化
# Auther: Aaron Fan #字符转格式化: name = input("Enter your name: ")age = int(input("Enter ...
- Entity Relationships
Entity Relationships: Here, you will learn how entity framework manages the relationships between en ...
- bootstrap学习网址
http://www.bootcss.com/ bootstrap中文学习网址
- MSSQL数据库设计心得
统一库名命名规则. 格式:公司简称_库名 如:Supesoft_Member 会员库 建库时,最好将初始大小设置为你认为可允许的最大容量.避免因为库太小,而出现系统自增加.在系统运行中,自动增加空间 ...