Django - 模型表单集 - 前端验证不起作用

问题描述

我正在使用模型表单集。这是我的表格:

class UnloadForm(forms.ModelForm):
    class Meta:
        model = Unload
        fields = '__all__'

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.fields['fieldContract'].queryset = FieldContract.objects.filter(applicativeContract__contract__is_active=True).order_by('applicativeContract__contract__internal_code','applicativeContract__internal_code','internal_code')
        self.fields['product'].queryset = Product.objects.all().order_by('name')


class BaseUnloadFormset(BaseModelFormSet):
    def clean(self):
        super().clean()

        for form in self.forms:
            cd = form.cleaned_data
            whouse = cd['whouse']
            company = cd['company']
            product = cd['product']
            quantity = cd['quantity']
            movement_date = cd['movement_date']
            helper = StockHelper(product,whouse,company,movement_date)
            if quantity > helper.stock:
                raise ValidationError(f'Attenzione quantità massima disponibile di {product}: {helper.stock}')
            return cd

UnloadFormSet = modelformset_factory(
    model = Unload,fields = '__all__',extra = 5,form = UnloadForm,formset=BaseUnloadFormset
)

class UnloadFormSetHelper(FormHelper):
    def __init__(self,**kwargs)
        self.form_tag = False
        self.layout = Layout(
            Row(
                'whouse','fieldContract','company','product','quantity','movement_date',)
        )
        self.render_required_fields = True

当我在 BaseUnloadFormset 中添加了 clean 方法时,问题就出现了。 由于模型中的所有字段都是必需的,例如不说明运动日期会提示前端验证。 不幸的是,虽然网页的源代码显示该字段实际上是必需的,但忘记移动日期会将表单发送到后端,最终系统会崩溃,因为cleaned_data字典中没有移动日期,从而引发KeyError .

我试图按照文档来覆盖干净的方法Django Docs on overriding the formset clean method

删除表单中的clean方法,将恢复如下图所示的正确行为:

enter image description here

以防万一,这是我的观点:

def unload(request):
    helper = UnloadFormSetHelper()
    context = {
        'helper': helper,'title': 'Nuovo SCarico',}
    if request.method == 'GET':
        formset = UnloadFormSet(queryset=Unload.objects.none())
        load_user_companies_in_formset(request,formset)
        context['formset'] = formset

    elif request.method == 'POST':
        formset = UnloadFormSet(request.POST)
        context['formset'] = formset
        load_user_companies_in_formset(request,formset)
        if formset.is_valid():
            formset.save()
            messages.success(request,'Scarico salvato correttamente',fail_silently=True)
            return HttpResponseRedirect(reverse('warehouse:dashboard'))
        else:
            return render(request,'warehouse/unload.html',context)

    return render(request,context)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)