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类时,主要涉及到 [ ...
随机推荐
- mui封装的ajax请求
由于项目中引进MUI框架,所以就不需要引进jquery,但需要和后台交互时,常写为jquery格式:所以笔者觉得有必要将mui封装的ajax请求在这里提一下: 1,mui框架基于htm5plus的XM ...
- DAY5-常用模块
一 time与datetime模块 二.random模块 三.os模块 四.sys模块 五 shutil模块 六 json&pickle模块 七 shelve模块 八 xml模块 九 conf ...
- 剑指offer 04_替换字符串中的空格
#include <stdio.h> void ReplaceBlank(char string[],int length){ if(string == NULL || length == ...
- 《Android应用性能优化》 第6章 性能评测和剖析
1.时间测量 System.currentTimeMillis 精读和准确度可能不够:更改系统时间会影响结果:UTC时间1970/1/1 00:00:00到现在的毫秒数 System.nanoTime ...
- 提示crontab command not found的解决方法
操作步骤 1. 确认crontab是否安装: 执行 crontab 命令如果报 command not found,就表明没有安装 2. 安装 crontab 执行 yum insta ...
- windows下单机版的伪分布式solrCloud环境搭建Tomcat+solr+zookeeper
原文出自:http://sbp810050504.blog.51cto.com/2799422/1408322 按照该方法,伪分布式solr部署成功 ...
- Android LayoutInflater学习
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- bzoj4391 [Usaco2015 dec]High Card Low Card
传送门 分析 神奇的贪心,令f[i]表示前i个每次都出比对方稍微大一点的牌最多能赢几次 g[i]表示从i-n中每次出比对方稍微小一点的牌最多赢几次 ans=max(f[i]+g[i+1]) 0< ...
- 解决SQL Server [Suspect]
昨天因断电,数据库 "DatabaseName" 被标记为 [Suspect],被质疑了? Search 后,以下方案最终解决了问题. USE [master] GO ALTER ...
- 带有通配符的字符串匹配算法-C/C++
日前某君给我出了这样一道题目:两个字符串,一个是普通字符串,另一个含有*和?通配符,*代表零个到多个任意字符,?代表一个任意字符,通配符可能多次出现.写一个算法,比较两个字符串是否相等. 我花了四个小 ...