【发布时间】:2021-03-30 19:06:17
【问题描述】:
如果在 inlineformset 中发现重复条目,我会尝试引发 ValidationError,就像在文档中一样:Custom formset validation 我正在使用调试工具并逐步执行代码。它成功到达行:raise ValidationError("Check Duplicate Entry"),随后,在视图中,它采用 else 语句而不是继续 if formset.is_valid。我 print(formset.non_form_errors) 就像在文档中一样。但是,文档中的示例在此阶段返回一个列表,其中包含错误消息。就我而言,我得到<bound method BaseFormSet.non_form_errors of <django.forms.formsets.MyInlineFormSet object at 0x7fcc22e89610>> 模板与表单数据一起呈现,但验证错误似乎没有说明问题所在。我肯定错过了一些东西。任何帮助表示赞赏。
class MyInlineFormSet(BaseInlineFormSet):
def __init__(self, *args, **kwargs):
super(MyInlineFormSet, self).__init__(*args, **kwargs)
for form in self.forms:
form.empty_permitted = False
def clean(self):
if any(self.errors):
return
mylist = []
for form in self.forms:
myfield_data = form.cleaned_data.get("myfield")
if myfield_data in mylist:
raise ValidationError("Check Duplicate Entry")
mylist.append(myfield_data)
我的模板就是这样:
{% block content %}
<section class="container-fluid">
{% crispy form %}
</section>
{% endblock content %}
旁注:针对特定字段的任何字段验证错误都会显示出来。但是我写的错误是这样的: self._errors["fieldname"] = self.error_class(["Error in field, please double check"]) Not sure why raise ValidationError is not working for the formset
【问题讨论】:
-
请注意,只有当您的表单集中的其余表单中没有其他错误时,您的 clean 方法才会运行。这就是
if any(self.errors): return正在做的事情。您能否确认没有其他错误。 -
是的,因为我在 VSCode 中使用调试工具,它会逐行执行这些行,因此我可以看到它正在运行哪些行。我可以用视图更新我的代码
-
所以当您在调试时单步执行时,会引发 ValidationError,但它没有显示在表单上?
-
是的,你能添加视图吗?那会很有用。
-
是的,它到达了 raise ValidationError 行,导致它重新呈现表单,但没有显示验证错误。我刚刚看到这似乎是一个类似的问题:stackoverflow.com/questions/19094974/…。该解决方案建议在上下文中发送表单错误,但我使用的是基于分类的视图