formset:适用于对多个表单进行操作,字段需要也可以用model中的表的字段来作为验证规则。
modelformset:适用于对多个表单进行操作,字段需要也可以用model中的表的字段来作为验证规则,速度可能快一些(有待考证)
formset用法:
from django import forms from django.forms import widgets from django.core.exceptions import ValidationError class MultiPermissionForm(forms.Form): id = forms.IntegerField( widget=widgets.HiddenInput(), required=False ) title = forms.CharField( widget=widgets.TextInput(attrs={'class': "form-control"}) ) url = forms.CharField( widget=widgets.TextInput(attrs={'class': "form-control"}) ) name = forms.CharField( widget=widgets.TextInput(attrs={'class': "form-control"}) ) menu_id = forms.ChoiceField( choices=[(None, '-----')], widget=widgets.Select(attrs={'class': "form-control"}), required=False, ) pid_id = forms.ChoiceField( choices=[(None, '-----')], widget=widgets.Select(attrs={'class': "form-control"}), required=False, ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['menu_id'].choices += models.Menu.objects.values_list('id', 'title') self.fields['pid_id'].choices += models.Permission.objects.filter(pid__isnull=True).exclude( menu__isnull=True).values_list('id', 'title') def clean_pid_id(self): menu = self.cleaned_data.get('menu_id') pid = self.cleaned_data.get('pid_id') if menu and pid: raise forms.ValidationError('菜单和根权限同时只能选择一个') return pid from django.forms.models import formset_factory from django.shortcuts import render, redirect def add(request): """ 增加 :param request: :return: """ MultiPermissionFormSet = formset_factory(MultiPermissionForm, extra=0) if request.method == 'GET': form = MultiPermissionFormSet() return render(request,'list.html',{'form':form} form = MultiPermissionFormSet(request.post) if form.is_valid(): return redirect('url') else: ......... def edit(request): """ 修改 :param request: :return: """ MultiPermissionFormSet = formset_factory(MultiPermissionForm, extra=0) if request.method == 'GET': form = MultiPermissionFormSet('数据') # formset是支持批量修改的所以 这里传入的数据一定要是可迭代对象,并且里面的 数据类型是字典或者对象 return render(request,'list.html',{'form':form} form = MultiPermissionFormSet(request.post) if form.is_valid(): return redirect('url') else: .........