1.应用说明
一般在表单信息录入中,如果存在许多重复提交的信息,我们就需要进行批量处理,比如学生信息的批量录入。

这里一种方式就是使用xlrd模块处理,把学生信息录入到系统内

另外一种方式就是采用我们from组件中提供的formset来进行批量处理,实现用户在同一页面提交多张表单

2.相关源码

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def formset_factory(form, formset=BaseFormSet, extra=1, can_order=False,can_delete=False, max_num=None, validate_max=False,min_num=None, validate_min=False):"""Return a FormSet for the given form class."""if min_num is None:min_num = DEFAULT_MIN_NUMif max_num is None:max_num = DEFAULT_MAX_NUM# hard limit on forms instantiated, to prevent memory-exhaustion attacks# limit is simply max_num + DEFAULT_MAX_NUM (which is 2*DEFAULT_MAX_NUM# if max_num is None in the first place)absolute_max = max_num + DEFAULT_MAX_NUMattrs = {'form': form, 'extra': extra,'can_order': can_order, 'can_delete': can_delete,'min_num': min_num, 'max_num': max_num,'absolute_max': absolute_max, 'validate_min': validate_min,'validate_max': validate_max}return type(form.__name__ + str('FormSet'), (formset,), attrs)

该函数主要用来处理表单集

3.批量添加案例

models.pyfrom django.db import modelsclass User(models.Model):user = models.CharField(max_length=32)pwd = models.CharField(max_length=32)email = models.CharField(max_length=32)
urls.pyfrom django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/', views.index),
]
viewspyfrom django.shortcuts import render,HttpResponse
from django import forms
from app01 import models"""
class UserForm(forms.Form):id = forms.CharField(required=True)user = forms.CharField(required=True)pwd = forms.CharField(required=True)email = forms.CharField(required=True)
"""
# 简写版
class UserForm(forms.ModelForm):class Meta:model = models.Userfields ="__all__"def index(request):# 生成一个类,它是form集合。extra设置展示的表单数量UserFormSet = forms.formset_factory(UserForm,extra=3,)if request.method == 'GET':formset = UserFormSet()return render(request,"index.html",{'formset':formset})formset = UserFormSet(request.POST)if formset.is_valid():flag = False  # 标志位for row in formset.cleaned_data:if row:# **表示将字典扩展为关键字参数res = models.User.objects.create(**row)if res:  # 判断返回信息flag = Trueif flag:return HttpResponse('添加成功')else:return HttpResponse('添加失败')return render(request, "index.html", {'formset': formset})

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form method="post">{{ formset.management_form }}{% csrf_token %}<table border="1"><tr><th>用户名</th><th>密码</th><th>邮箱</th></tr>{% for form in formset %}<tr>{% for field in form %}<td>{{ field }} {{ field.errors.0 }} </td>{% endfor %}</tr>{% endfor %}</table><input type="submit" value="提交">
</form>
</body>
</html>

效果:

直接点击提交,返回添加失败,只添加一行数据,返回添加成功,添加部分数据:

4.批量修改案例

这里其实在页面渲染出来数据,再进行修改在全部写入即可,当中获取它修改的表单id,以及使用initial方法

在上面的基础上在做修改:

views.py

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from django.shortcuts import render
from django import forms
from app01 import modelsclass UserForm(forms.Form):id = forms.CharField(required=True)user = forms.CharField(required=True)pwd = forms.CharField(required=True)email = forms.CharField(required=True)def index(request):queryset = models.User.objects.all().values()UserFormSet = forms.formset_factory(UserForm,extra=0)if request.method == 'GET':#  initial 参数用来给 ModelForm 定义初始值formset = UserFormSet(initial=queryset)return render(request,'index.html',{'formset':formset})formset = UserFormSet(request.POST)if formset.is_valid():for row in formset.cleaned_data:# 删除字典携带的idid = row.pop('id')models.User.objects.filter(id=id).update(**row)return render(request, 'index.html', {'formset': formset})

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.hide{display: none;}</style>
</head>
<body><form method="post">{{ formset.management_form }}{% csrf_token %}<table border="1"><tr><th>用户名</th><th>密码</th><th>邮箱</th></tr>{% for form in formset %}<tr>{% for field in form %}{% if forloop.first %}<td class="hide">{{ field }} </td>{% else %}<td>{{ field }} {{ field.errors.0 }} </td>{% endif %}{% endfor %}</tr>{% endfor %}</table><input type="submit" value="提交"></form>
</body>
</html>

效果还是和上面案例一样,我们对于某个字段做修改:

提交至数据库

这里更新的时候,需要使用到id,但是它不需要在表单中显示出来,所以我们在html中对它做了隐藏处理

至于为什么这里不是用forms.ModelForm而是使用forms.Form,是因为ModelForm默认的全部字段中没有包含id

django批量form表单处理相关推荐

  1. Django的Form表单

    Django的Form表单 Django Form  Form介绍 Form 表单是在前端向后端提交数据最常用的方式,同时在好多场景下都需要对用户的输入进行校验. 以注册为例,Form 需要的三件事: ...

  2. django之Form表单

    HTML表单 在HTML中,表单是<form>...</form> 之间元素的集合,它们允许访问者输入文本.选择选项.操作对象和控制等等,然后将信息发送回服务器. 某些表单的元 ...

  3. 框架生成的HTML修改,Django框架form表单验证 修改html标签的样式

    经过前面的学习,我们大致可以知道CharField.EmailField等等以Field结尾的方法,只能帮助我们对用户发来的信息做验证,不能生成html标签.字段本身自己虽然只做验证,但是我们可以通过 ...

  4. Django(part46)--form表单验证

    学习笔记,仅供参考 文章目录 form表单验证 举个例子 form表单验证 form提供表单和字段验证,我们可以使用form.is_valid() 方法进行表单验证,若该方法返回值为True,则表示当 ...

  5. Django(part17)--form表单提交数据

    学习笔记,仅供参考,有错必纠 form表单 form表单的主要作用是和服务器进行交互,为服务器端提供数据. name属性 form表单有name属性,name属性类似于客户端与服务器端之间的约定. f ...

  6. Django之form表单组件、cookie与session

    ---恢复内容开始--- Form表单组件 引例: 先来看一个注册的例子,全部用的是reg函数来实现的. views.py文件 def reg(request):errors = {'username ...

  7. django,form表单,数据库增删改查

    Django 02  复习:   Django下载:    在命令行输入:     pip3 install django==1.11.11     在这里不要用最新的3.7,推荐使用3.6/3.5/ ...

  8. Django之Form表单验证组件Tyrion

    Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...

  9. django ajax form表单,Django学习系列之Form表单和ajax(示例代码)

    昵       称: 生       日: 性       别:     男 女 地       址: 手  机  号: 邮       箱: [修改] {% csrf_token %}$(\'#js ...

最新文章

  1. Keycloak宣布不再适配Spring Boot和Spring Security
  2. python书籍_Python书籍大汇总——入门到实战
  3. struts2 redirect 获取参数null_社会化登录支持授权域以便于获取更大权限
  4. php 页面开启错误提示,php开启与关闭错误提示
  5. 线性回归用matlab怎么做,matlab中如何应用regress()函数进行线性回归分析?
  6. “数据结构+算法”视角的Asprova
  7. 【DP】LeetCode 64. Minimum Path Sum
  8. java工厂模式的学习
  9. 零基础Python知识点回顾(三)
  10. 制作android刷机补丁update.zip 的步骤,android-update.zip 刷机包制作教程.pdf
  11. 尚硅谷大数据hadoop教程
  12. BT500-BT1788主观质量评价
  13. jQuery对checkbox的各种操作
  14. ShareSDK分享 和新浪登陆冲突解决方法
  15. ffmepg处理10bit 和8bit yuv总结
  16. java Base64编解码
  17. 葫芦书笔记----循环神经网络(RNN)
  18. 习题3.3投骰子的随机游戏
  19. 电脑连接树莓派3B+
  20. NTP客户端配置-Windows时间同步设置

热门文章

  1. 掌握Angular2的服务(service)
  2. OpenJudge/Poj 1163 The Triangle
  3. 项目管理理论与实践(1)——企业项目管理介绍
  4. GestureDetector.OnGestureListener 详解
  5. 文件管理的艺术之SVN从零搭建
  6. ASP.NETmvc常用JQUERY插件【jquery.dataTables.js】
  7. 抽象工厂模式解析例子
  8. 【PP生产订单】入门介绍(六)
  9. LTRIM、RTRIM和TRIM在ORACLE中的用法:
  10. SAP上线前数据重置方式总结