日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

django批量form表单处理

發(fā)布時(shí)間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django批量form表单处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。