django批量form表单处理
1.應(yīng)用說(shuō)明
一般在表單信息錄入中,如果存在許多重復(fù)提交的信息,我們就需要進(jìn)行批量處理,比如學(xué)生信息的批量錄入。
這里一種方式就是使用xlrd模塊處理,把學(xué)生信息錄入到系統(tǒng)內(nèi)
另外一種方式就是采用我們from組件中提供的formset來(lái)進(jìn)行批量處理,實(shí)現(xiàn)用戶在同一頁(yè)面提交多張表單
2.相關(guān)源碼
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和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)該函數(shù)主要用來(lái)處理表單集
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) """ # 簡(jiǎn)寫版 class UserForm(forms.ModelForm):class Meta:model = models.Userfields ="__all__"def index(request):# 生成一個(gè)類,它是form集合。extra設(shè)置展示的表單數(shù)量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 # 標(biāo)志位for row in formset.cleaned_data:if row:# **表示將字典擴(kuò)展為關(guān)鍵字參數(shù)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>效果:
直接點(diǎn)擊提交,返回添加失敗,只添加一行數(shù)據(jù),返回添加成功,添加部分?jǐn)?shù)據(jù):
4.批量修改案例
這里其實(shí)在頁(yè)面渲染出來(lái)數(shù)據(jù),再進(jìn)行修改在全部寫入即可,當(dāng)中獲取它修改的表單id,以及使用initial方法
在上面的基礎(chǔ)上在做修改:
views.py
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和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 參數(shù)用來(lái)給 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>效果還是和上面案例一樣,我們對(duì)于某個(gè)字段做修改:
提交至數(shù)據(jù)庫(kù)
這里更新的時(shí)候,需要使用到id,但是它不需要在表單中顯示出來(lái),所以我們?cè)趆tml中對(duì)它做了隱藏處理
至于為什么這里不是用forms.ModelForm而是使用forms.Form,是因?yàn)镸odelForm默認(rèn)的全部字段中沒(méi)有包含id
總結(jié)
以上是生活随笔為你收集整理的django批量form表单处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python命名空间的本质
- 下一篇: django中csrftoken跨站请求