Django 的 model form 组件

Model Form 组件的由来

之前介绍过 Django 的 Form 组件(Django的Form表单)使用方法,Form 组件能够帮我们做三件事:

  1. 生成页面可用的HTML标签

  2. 对用户提交的数据进行校验

  3. 保留上次输入内容

我们发现,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 组件的更多相关文章

  1. Django的model form组件

    前言 首先对于form组件通过全面的博客介绍,对于form我们应该知道了它的大致用法,这里我们需要明确的一点是,我们定义的form与model其实没有什么关系,只是在逻辑上定义form的时候字段名期的 ...

  2. python3-开发进阶Django-form组件中model form组件

    Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样 ...

  3. Django中的form组件

    Django中的form组件有两大作用 1.验证获取正确的结果或者错误信息 2.生成html代码 一.为什么需要form组件呢? 在写form表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...

  4. Django框架 之 form组件

    Django框架 之 form组件 浏览目录 Form介绍 普通的登录 使用form组件 Form详情 常用字段 校验 进阶 使用Django Form流程 一.Form介绍 我们之前在HTML页面中 ...

  5. Django框架11 /form组件、modelForm组件

    Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...

  6. 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 ...

  7. 14 Django之Form和Model Form组件

    一.什么是Form 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用 ...

  8. django补充和form组件

    Model常用操作: - 参数:filter - all,values,values_list [obj(id,name,pwd,email),obj(id,name,pwd,email),] mod ...

  9. Python开发【Django】:Form组件

    Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...

随机推荐

  1. eclipse中的TODO和FIXME

    最近使用eclipse开发代码时,公司要求按他们制定代码规范编写代码,其他都还好,因为基本都养成良好习惯了,但TODO和FIXME就有点陌生,查了一下资料,发现笔者寡闻了,果然学海无涯,好了,下边解释 ...

  2. 回调函数(callback)经典解答

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:常溪玲链接:http://www.zhihu.com/question/19801131/answer/13005983来源: ...

  3. DAY11-MYSQL数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  4. MSSQL 当前数据库中已存在用户或角色,SQLServer2008,错误15023,

    原因: sql server中“登录”与“用户”的区别,“登录”用于用户身份验证,而数据库“用户”帐户用于数据库访问和权限验证.登录通过安全识别符 (SID) 与用户关联.将数据库恢复到其他服务器时, ...

  5. webfrom 母版页

    ASP.NET中母版页作用 一是提高代码的复用(把相同的代码抽出来) 二是使整个网站保持一致的风格和样式. 母版页存在就一定要有内容页的存在,否则母版页的存在就没有了意义. .master 一.添加母 ...

  6. DR客户端一直连接服务器....(6)

    DR客户端一直连接服务器....(非未选择网卡)解决方法: 控制面板-->网络和 Internet-->网络连接,打开本地连接(以太网)属性,将IPV4协议前面的对勾去掉,重启DR 这样D ...

  7. cakephp静态资源404

    location ~ /\.(css|js|woff|ttf|gif|jpg|jpeg|png|bmp|swf) { rewrite ^/$/(.*)$ /$/app/webroot/$ last; ...

  8. Entity Framework Tutorial Basics(11):Code First

    Code First development with Entity Framework: Entity Framework supports three different development ...

  9. Ping命令的设计与实现

    ping命令的设计与实现 发表于 C++ Socket TCP/IP 2016-05-15 19:07 字数: 10796 阅读量: 528 ping 命令使用的相关 TCP/IP 协议 ping 命 ...

  10. 20169219《Linux内核原理与分析》课程总结

    第一周作业 这周主要学习l了linux基础入门这个课,还是很有用的.一周学完,前两个可能做起来比较慢,但是后面就快了,不要放弃希望,你可以的! 我就是没写到博客里面,哼哼,你就不要看了.自己总结吧,摊 ...