django批量form表单处理

1.应用说明

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

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

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

2.相关源码

formsets.py

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_NUM
if 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_NUM
attrs = {'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.py

from django.db import models
class User(models.Model):
user = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
email = models.CharField(max_length=32)

urls.py

from 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),
]

viewspy

from 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.User
fields ="__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 = True
if 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

from django.shortcuts import render
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)
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:
# 删除字典携带的id
id = 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

 


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写弹出框,设置遮罩,布局设计。

传统的设计弹出框和遮罩 <template> <div> <div class"这里是内容"> <div class"这里是遮罩"></div> </div> </div> </template> 转载于:https://www.cnblogs.com/phermis/p/11395395.html

【转】一步一步教你远程调用EJB

一步一步教你远程调用EJB http://www.diybl.com/course/1_web/webjs/20071226/94785.htmlwww.diybl.com 时间&#xff1a;2007-12-26 作者:佚名 编辑:本站 点击&#xff1a; 686 [评论]前期准备&#xff1a;弄清楚weblogic&#xff08;或jboss&#xff09;、tomcat、JBluder…

ADF:弹出窗口,对话框和输入组件

在本文中&#xff0c;当我们有一个af&#xff1a;popup包含af&#xff1a;dialog并在其中包含输入组件时&#xff0c;我想着重介绍一个非常常见的用例。 在实现此用例时&#xff0c;需要注意一些陷阱。 让我们考虑一个简单的示例&#xff1a; <af:popup id"p1" …

关于codeforces加载慢

昨天cdx报名cf&#xff0c;打开网页10多分钟才交了、、、。 今天问了wxy&#xff0c;百度了一下&#xff0c;以前也搜过&#xff0c;然后就忘记了。 今天记一下。 1.右键单击开始按钮&#xff0c;打开资源管理器&#xff0c;在资源管理器的地址栏中填写“%SystemRoot%\System3…

ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE

前言 这是一篇纯技术干货的分享文章&#xff0c;FreeSql 已经基本完成 .NETCore 最方便的 ORM 使命&#xff0c;我们正在筹备生态的建立&#xff0c;比如 ABP 中如何使用 FreeSql 的实现&#xff0c;需要各种各样的扩展包&#xff0c;好多好多工作量。有没有大神愿意无偿参与做…

Hadoop Ecosystem解决方案---数据仓库

个人总结的一套基于hadoop的海量数据挖掘的开源解决方案.BI系统:Pentahopentaho是开源的BI系统中做得算顶尖的了.提供的核心功能如下:报表功能: 可视化(client, web)的报表设计. 分析功能: 可以生成分析视图&#xff0c;作数据作动态分析. Dashboard功能: 可以定制动态图…

django中间件及中间件实现的登录验证

1.定义 一个用来处理Django的请求和响应的框架级别的钩子&#xff08;函数&#xff09;&#xff0c;相对比较轻量级&#xff0c;并且在全局上改变django的输入与输出&#xff08;使用需谨慎&#xff0c;否则影响性能&#xff09; 直白的说中间件就是帮助我们在视图函数执行之前…

默认方法:Java 8的无名英雄

几周前&#xff0c;我写了一个博客&#xff0c;说开发人员学习新语言是因为它们很酷。 我仍然坚持这个主张&#xff0c;因为关于Java 8的事情真的很酷。 毫无疑问&#xff0c;该节目的明星是添加了Lambdas以及将函数提升为一等变量&#xff0c;而我目前最喜欢的是默认方法。 这…

用phpstudy配置网站遇到的一些问题

第一次是配置在我本机&#xff0c;总是连不上数据库&#xff0c;后来查看到mysql.ini配置文件里面端口号有一个不是3306&#xff0c;更改之后就好了。 第二次是配置在笔记本电脑上&#xff0c;安装的时候比较顺利&#xff0c;也就遇到80端口被占用还有缺少VC运行库的问题&#…

二进制和十进制的相互转换

十进制转二进制&#xff1a; 方法一&#xff1a;y…… 25 * x 24 * x 23 * x 22 * x 21 * x 20 * x&#xff0c;其中y是十进制数字&#xff0c;x是0或1。 方法二&#xff1a; 二进制转十进制&#xff1a; 10100125 * 1 24 * 0 23 * 1 22 * 0 21 * 0 20 * 141 更多专业前端知…

Teradata Expression 12 在Windows 2003上Connection Reset 问题的解决方法

Teradata Expression 12 安装在Windows 2003上&#xff08; 企业版 sp2&#xff09;&#xff0c;完全按照安装手册指导安装。安装过程一切顺利。完成后重启系统。通过Teradata Service Control启动一切正常。状态显示Teradata Running&#xff0c;打开session info ,可以看到一…

Hadoop开发工具简介

几天前&#xff0c; Apache Hadoop开发工具 &#xff08;又名HDT &#xff09;发布了。 这些项目旨在将插件引入eclipse中&#xff0c;以简化Hadoop平台上的开发。 该博客旨在概述HDT的一些重要功能。 单端点 该项目可以充当HDFS&#xff0c;Zookeeper和MR群集的单个端点。 您…

分布式理论之一:Paxos算法的通俗理解

https://www.cnblogs.com/esingchan/p/3917718.html转载于:https://www.cnblogs.com/JBLi/p/10732044.html

UML 面向对象分析与设计

面向对象方法以其超越传统方法的技术先进性越来越得到更多的重视&#xff0c;但技术的先进性不能完全代表一种新生事物的最后成功&#xff0c;还要看它是否能得到有效的推广。统一建模语言&#xff08;UML&#xff09;的产生为这种推广规定了一致的表示&#xff0c;诸多开发过程…

MVC 之var与dynamic

如果你用MVC写过程序&#xff0c;那么你应该知道ViewBag这个用于前后台的数据传递工具&#xff0c;那么你是否对ViewBag的用法感到过疑惑呢&#xff1f; ViewBag.Mode1lnew object();ViewBag.Model2new object();ViewBag.Model3new object();...... 我们知道&#xff0c;在使用…

使用Spring MVC时的常见错误

当我大约10年前开始我的职业生涯时&#xff0c;Struts MVC就是市场上的常态。 但是&#xff0c;多年来&#xff0c;我观察到Spring MVC逐渐流行起来。 鉴于Spring MVC与Spring容器的无缝集成以及它提供的灵活性和可扩展性&#xff0c;这对我来说并不奇怪。 从到目前为止的Spri…

CopyOnWriteArrayList

CopyOnWriteArrayList&#xff0c;add&#xff0c;引用赋值是原子操作吗&#xff1f; 引用类型的读写均是原子操作&#xff0c;https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.7&#xff0c;https://www.v2ex.com/t/280788 转载于:https://www.cnblogs…

Statement与PreparedStatement区别

1.性能区别 Statement statement conn.createStatement(); PreparedStatement preStatement conn.prepareStatement(sql); 执行的时候: ResultSet rSet statement.executeQuery(sql); ResultSet pSet preStatement.executeQuery(); 由上可以看出&#xff0c;PreparedState…

C++ operator操作符重载(++,--,-,+,())

C中,--操作符重载需要说明是(--)在操作数前面,还是在操作数后面,区别如下: 代码经过测试无误(起码我这里没问题^_^)Code1#include <iostream> 2#include <cstdlib> 3using namespace std; 4template<typename T> class A 5{ 6public: 7 A(): m_(0){ 8 …

CSS3-2

倒圆角 <!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>Document</title></head><body> <h1>圆角边框 —— border-radius IE9</h1> <!-- border-radius 是复合属性…