gpt4 book ai didi

django - 如何处理表单集中无效的已删除表单

转载 作者:行者123 更新时间:2023-12-04 12:59:27 24 4
gpt4 key购买 nike

如果用户在 formset 中填写表单不完整,然后将其标记为删除,我的表单处理会非常糟糕。已删除的表单阻止 formset.cleaned_data 工作,因为它们不进行验证,因此表单没有cleaned_data 属性。如果我尝试遍历 formset.deleted_forms 并从 formset.forms 中删除表单,则 formset.cleaned_data 由于索引超出范围而崩溃。

我应该如何处理用户不想要的这些无效表​​单?

(这是我的错误,我从 google groups 复制了描述)

我不明白这个错误,因为查看 Django 代码我可以读到:

def is_valid(self):
"""
Returns True if form.errors is empty for every form in self.forms.
"""
if not self.is_bound:
return False
# We loop over every form.errors here rather than short circuiting on the
# first failure to make sure validation gets triggered for every form.
forms_valid = True
err = self.errors
for i in range(0, self.total_form_count()):
form = self.forms[i]
if self.can_delete: <-------
if self._should_delete_form(form):
# This form is going to be deleted so any of its errors
# should not cause the entire formset to be invalid.
continue
if bool(self.errors[i]):
forms_valid = False
return forms_valid and not bool(self.non_form_errors())

这时候,这是我避免错误的代码:
formFac = modelformset_factory(prm_model, extra = extra, can_delete = prm_can_delete )

if request.method == 'POST':
formSet = formFac( request.POST )
hi_ha_errors = False
if formSet.is_valid():
for form in formSet:
if form not in formSet.deleted_forms:
form.save()
for form in formSet.deleted_forms:
instance = form.instance
if instance.pk:
try:
instance.delete()
except Exception, e:
form._errors.setdefault(NON_FIELD_ERRORS, []).append(
'This row is referenced by others.' )
hi_ha_errors = True

if not hi_ha_errors:
return HttpResponseRedirect( prm_url_next )

最佳答案

我解决这个问题的方法是覆盖 full_clean()我在 Formset/ModelFormset 中使用的 Form/ModelForm 的方法

class MyModelForm(ModelForm):

def full_clean(self, *args, **kwargs):
super(MyModelForm, self).full_clean(*args, **kwargs)
if hasattr(self, 'cleaned_data') and self.cleaned_data.get('DELETE', False):
self._errors = ErrorDict()

如果选中表单删除框,则会清除错误列表.. 将显示没有错误的表单。但如果用户取消选中删除框并重新提交,则表单将正常显示错误。

关于django - 如何处理表单集中无效的已删除表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11074129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com