将关键字参数传递给从BaseFormSet扩展的formset

时间:2019-03-19 15:31:39

标签: django django-forms

我必须创建一个自定义表单集来验证我的表单集的结果。为了这个例子,我简化了验证。

forms.py

class BaseUserServiceFormSet(BaseFormSet): 

    def get_form_kwargs(self, index):
       kwargs = super().get_form_kwargs(index)
       kwargs['queryset'] = index
       return kwargs


    def clean(self):    
        for form in self.forms:
             user_title = form.cleaned_data['user_title']
             if user_title == None:
                 self.add_error('user_title', "Please enter a title for this service.")

在我看来,我正在将查询集传递到表单集中。

views.py

  UserServiceFormSet = modelformset_factory(UserService, form=UserServiceForm, formset=BaseUserServiceFormSet, extra=1, max_num=4, can_delete=True)
  formset = UserServiceFormSet(request.POST or None, request.FILES or None, queryset=UserService.objects.filter(user=user, title__extra_service=1), prefix='first')

打开页面时,出现以下错误:

__init__() got an unexpected keyword argument 'queryset'

我尝试将以下内容添加到我的BaseUserServiceFormSet中(在 forms.py 中),但随后开始出现一堆错误,这些错误涉及在BaseFormSet中初始化的默认值( https://docs.djangoproject.com/en/2.1/_modules/django/forms/formsets/)。换句话说,在我的代码中,我覆盖了BaseFormSet的默认初始化,这会破坏事情。

def __init__(self, *args, **kwargs):
    queryset = kwargs.pop('queryset') 

为了将查询集作为kwarg传递到表单集中,我必须做些什么改变?

谢谢!

1 个答案:

答案 0 :(得分:0)

由于您使用的是modelformset_factory,因此应该将BaseModelFormSet子类化。

class BaseUserServiceFormSet(BaseModelFormSet):    
    ...

您可能不应该执行queryset = kwargs.pop('queryset')-如果稍后在super().__init__(*args, **kwargs)方法中调用__init__,将阻止传递查询集。

get_form_kwargs用于将kwargs传递给表单,这不是您要在此处执行的操作。