从modelforms验证modelformsets

时间:2012-08-16 23:25:30

标签: django validation django-forms

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

我知道可以覆盖modelformset的clean方法,但我在询问是否可以在modelformset上使用modelform的字段清理方法?。目前,当我提交带有空字段的modelformset时,is_valid()传递给我看起来很奇怪......

我还想知道“通常”自定义模型形式验证代码的位置?我正在考虑使用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(),
                                           })

1 个答案:

答案 0 :(得分:3)

如果您未在模型表单集中的某个模型中输入任何数据,则会跳过该表单的验证; from the docs

  

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

您实际上可以通过在表单上强制empty_permitted=False来禁用此功能;请参阅此问题的已接受答案:Django formsets: make first required?

表单集执行have their own clean method,但它用于验证表单集中两个或多个表单之间的信息,而不是用于验证单个表单本身(应在表单clean方法中处理 - 正如你现在所做的那样。

  

formset有一个类似于Form类的方法。这是您在formset级别定义自己的验证的地方:

这是另一个类似的问题:

Django formset doesn't validate