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类时,主要涉及到 [ ...
随机推荐
- bitcode编译错误
xcode编译引用的静态库可能会出现编译错误: does not contain bitcode. You must rebuild it with bitcode enabled (Xcode se ...
- VC++ 6.0 快捷键
多行注释的快捷键 详细步骤 工具栏上右键-〉Customize-〉“Add-ins and Macro Files”tab页,把SAMPLE前面打上钩-〉“Commands”tab页,Categ ...
- Android Notification通知
/** * 在状态栏显示通知 */ private void showNotification(){ // 创建一个NotificationManager的引用 NotificationManager ...
- eclipse java 注释模板配置详解
设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...
- 【总结整理】WebGIS基础
1.万维网:www是world wide web的简称是在超文本基础上形成的信息网 2.互联网:即广域局域网及单机按照一定的通讯协议组成的国际计算机网络 3.WebGIS:网络地理信息系统,指基于In ...
- Zbar -- 源码分析
博客转载自:https://blog.csdn.net/sunflower_boy/article/details/50783179 //Img_scanner.c 文件内 int zbar_scan ...
- 激光SLAM Vs 视觉SLAM
博客转载自:https://www.leiphone.com/news/201707/ETupJVkOYdNkuLpz.html 雷锋网(公众号:雷锋网)按:本文作者SLAMTEC(思岚科技公号sla ...
- wpf 窗口打开后默认设置控件焦点
https://blog.csdn.net/Vblegend_2013/article/details/81771872 <Grid FocusManager.FocusedElement=&q ...
- HttpServletRequest和ServletRequest的区别.RP
问题: 请问HttpServletRequest和ServletRequest的区别? 回答: servlet理论上可以处理多种形式的请求响应形式 http只是其中之一 所以HttpServletRe ...
- 使用Notepad++运行Python脚本
1.安装python,我用的是anaconda 2.打开找到anaconda安装目录,找到python.exe,记录绝对路径.我的是D:\app\anaconda3\python.exe 3.Note ...