我必须创建一个自定义表单集来验证我的表单集的结果。为了这个例子,我简化了验证。
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传递到表单集中,我必须做些什么改变?
谢谢!
答案 0 :(得分:0)
由于您使用的是modelformset_factory
,因此应该将BaseModelFormSet
子类化。
class BaseUserServiceFormSet(BaseModelFormSet):
...
您可能不应该执行queryset = kwargs.pop('queryset')
-如果稍后在super().__init__(*args, **kwargs)
方法中调用__init__
,将阻止传递查询集。
get_form_kwargs
用于将kwargs传递给表单,这不是您要在此处执行的操作。