django批量form表单处理
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表单处理相关推荐
- Django的Form表单
Django的Form表单 Django Form Form介绍 Form 表单是在前端向后端提交数据最常用的方式,同时在好多场景下都需要对用户的输入进行校验. 以注册为例,Form 需要的三件事: ...
- django之Form表单
HTML表单 在HTML中,表单是<form>...</form> 之间元素的集合,它们允许访问者输入文本.选择选项.操作对象和控制等等,然后将信息发送回服务器. 某些表单的元 ...
- 框架生成的HTML修改,Django框架form表单验证 修改html标签的样式
经过前面的学习,我们大致可以知道CharField.EmailField等等以Field结尾的方法,只能帮助我们对用户发来的信息做验证,不能生成html标签.字段本身自己虽然只做验证,但是我们可以通过 ...
- Django(part46)--form表单验证
学习笔记,仅供参考 文章目录 form表单验证 举个例子 form表单验证 form提供表单和字段验证,我们可以使用form.is_valid() 方法进行表单验证,若该方法返回值为True,则表示当 ...
- Django(part17)--form表单提交数据
学习笔记,仅供参考,有错必纠 form表单 form表单的主要作用是和服务器进行交互,为服务器端提供数据. name属性 form表单有name属性,name属性类似于客户端与服务器端之间的约定. f ...
- Django之form表单组件、cookie与session
---恢复内容开始--- Form表单组件 引例: 先来看一个注册的例子,全部用的是reg函数来实现的. views.py文件 def reg(request):errors = {'username ...
- django,form表单,数据库增删改查
Django 02 复习: Django下载: 在命令行输入: pip3 install django==1.11.11 在这里不要用最新的3.7,推荐使用3.6/3.5/ ...
- Django之Form表单验证组件Tyrion
Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...
- django ajax form表单,Django学习系列之Form表单和ajax(示例代码)
昵 称: 生 日: 性 别: 男 女 地 址: 手 机 号: 邮 箱: [修改] {% csrf_token %}$(\'#js ...
最新文章
- Keycloak宣布不再适配Spring Boot和Spring Security
- python书籍_Python书籍大汇总——入门到实战
- struts2 redirect 获取参数null_社会化登录支持授权域以便于获取更大权限
- php 页面开启错误提示,php开启与关闭错误提示
- 线性回归用matlab怎么做,matlab中如何应用regress()函数进行线性回归分析?
- “数据结构+算法”视角的Asprova
- 【DP】LeetCode 64. Minimum Path Sum
- java工厂模式的学习
- 零基础Python知识点回顾(三)
- 制作android刷机补丁update.zip 的步骤,android-update.zip 刷机包制作教程.pdf
- 尚硅谷大数据hadoop教程
- BT500-BT1788主观质量评价
- jQuery对checkbox的各种操作
- ShareSDK分享 和新浪登陆冲突解决方法
- ffmepg处理10bit 和8bit yuv总结
- java Base64编解码
- 葫芦书笔记----循环神经网络(RNN)
- 习题3.3投骰子的随机游戏
- 电脑连接树莓派3B+
- NTP客户端配置-Windows时间同步设置