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:
         .........
views.py

相关文章:

  • 2022-12-23
  • 2021-09-05
  • 2022-12-23
  • 2021-07-07
  • 2021-06-18
  • 2021-08-11
  • 2021-07-18
  • 2022-12-23
猜你喜欢
  • 2021-08-25
  • 2022-03-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2019-12-05
相关资源
相似解决方案