0

我的一个观点是使用带有自定义字段清理的模型表单。一种类型的清理是检查用户是否尝试提交对已设置为该值的字段的更改,并且它通过抛出 ValidationError 完全按照我希望的方式工作。问题当然是我一次只能提交一个表单,所以我想使用一个modelformset来提交多个表单。

我知道可以覆盖modelformset的clean方法,但我问是否可以在modelformset上使用modelform的字段清理方法?. 目前,当我提交带有空字段的模型表单集时,is_valid() 通过了,这对我来说似乎很奇怪......

我也想知道“通常”自定义modelformset验证代码会去哪里?我在考虑forms.py。

*编辑——带答案。我的 httpResponseRedirect 允许在未经验证的情况下提交表单。

def mass_check_in(request):
    # queryset
    qs = Part.objects.none()
    errlst=[]
    c = {}
    c.update(csrf(request))

    # Creating a model_formset out of PartForm
    PartFormSetFactory = modelformset_factory(model=Part,
                                              form=PartForm,
                                              formset=BasePartFormSet, 
                                              extra=2)
    if request.method == 'POST':
        PartFormSet = PartFormSetFactory(request.POST)
        if PartFormSet.is_valid():
            PartFormSet.save()
            return http.HttpResponseRedirect('/current_count/')

    else:        
        PartFormSet = PartFormSetFactory(queryset=qs, initial=[
                                                               {'serial_number':'placeholder',
                                                                },
                                                               {'serial_number':'placeholder'
                                                                }])

    return render(request,'mass_check_in.html',{
                                           'title':'Add Item',
                                           'formset': PartFormSet,
                                           'formset_errors': PartFormSet.non_form_errors(),
                                           })
4

1 回答 1

4

如果您根本没有在模型表单集中的模型表单之一中输入任何数据,它将跳过对该表单的验证;来自文档

表单集足够聪明,可以忽略未更改的额外表单。

您实际上可以通过强制empty_permitted=False表单禁用此功能;有关更多信息,请参阅此问题的公认答案:Django formsets: make first required?

表单集确实有自己的clean方法,但它用于验证表单集中两个或多个表单之间的信息,而不是用于验证单个表单本身(应该在表单clean方法中处理 - 正如您现在所做的那样。

表单集有一个类似于 Form 类的干净方法。这是您定义自己的在表单集级别工作的验证的地方:

这是另一个类似的问题:

Django formset 不验证

于 2012-08-17T01:02:19.613 回答