问题描述
我正在使用模型表单集。这是我的表格:
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
以防万一,这是我的观点:
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 (将#修改为@)