Django InlineFormSet验证
我有一个Django InlineFormSet验证,django,django-forms,Django,Django Forms,我有一个BaseInlineFormSet,我想根据子窗体字段上的值验证父窗体中的字段。如中所示,进行自定义验证的唯一方法是clean(),但我找不到将错误添加到父窗体的方法,仅针对子窗体 在下面的代码中,我构建了一个公式。每个变量都来自一个内部表单,如果全局公式无法验证,我想在父级的表单字段formula 类CustomInlineFormSet(BaseInlineFormSet): def清洁(自清洁): 公式=self.instance.formula 变量=[] 对于self.form
BaseInlineFormSet
,我想根据子窗体字段上的值验证父窗体中的字段。如中所示,进行自定义验证的唯一方法是clean()
,但我找不到将错误添加到父窗体的方法,仅针对子窗体
在下面的代码中,我构建了一个公式。每个变量都来自一个内部表单,如果全局公式无法验证,我想在父级的表单字段formula
类CustomInlineFormSet(BaseInlineFormSet):
def清洁(自清洁):
公式=self.instance.formula
变量=[]
对于self.forms中的表单:
如果form.cleaned\u数据中有“formula\u variable”:
variables.append(form.cleaned_data['formula_variable']))
有效,msg=validate_公式(公式,变量)
如果无效:
这是什么???
查看以下链接:
及
但似乎要点是:
的ModelAdmin
有一个干净的方法来执行mainModelForm
实例的验证Model
可以访问ModelAdmin
s()InlineFormset
无权访问ModelForm
或ModelAdmin
的表单集(因此它的clean方法无法交叉验证内联线)ModelAdmin
- 内联线的
(BaseModelFormSet
扩展BaseInlineFormSet
)具有BaseModelFormSet
方法(请参阅),但无法以任何方式访问主clean
实例Model
class FormulaCreate(CreateView):
model = Formula
template_name = "whatever.html"
def get_context_data(self, **kwargs):
context = super(ParameterRatioCreate, self).get_context_data(**kwargs)
if self.request.POST:
formset = FormulaVariablesFormSet(self.request.POST, instance=self.object)
context['form'] = FormulaForm(formset=formset, data=self.request.POST, instance=self.object)
context['formset'] = formset
else:
formset = FormulaVariablesFormSet(instance=self.object)
context['form'] = FormulaForm(formset=formset, instance=self.object)
context['formset'] = formset
return context
def form_valid(self, form):
context = self.get_context_data()
form = context['form']
formset = context['formset']
if form.is_valid() and formset.is_valid():
ratio = form.save()
formset = FormulaVariablesFormSet(self.request.POST, instance=ratio)
if formset.is_valid():
formset.save()
self.object = ratio
return redirect(self.get_success_url())
context['formset'] = formset
return self.render_to_response(context)
class FormulaForm(forms.ModelForm):
class Meta:
model = Formula
def __init__(self, formset, *args, **kwargs):
self.formset = formset
super(FormulaForm, self).__init__(*args, **kwargs)
def clean(self):
variables = {}
for form in self.formset:
if form.is_valid() and 'formula_variable' in form.cleaned_data:
variables[form.cleaned_data['formula_variable']] = 1
if 'formula' in self.cleaned_data:
formula = self.cleaned_data['formula']
valid, msg = do_formula(formula, variables)
if not valid:
self._errors['formula'] = self.error_class([msg])
del self.cleaned_data['formula']
return self.cleaned_data
FormulaVariablesFormSet = inlineformset_factory(Formula,
FormulaVariable,
extra=1)
表格:
class FormulaCreate(CreateView):
model = Formula
template_name = "whatever.html"
def get_context_data(self, **kwargs):
context = super(ParameterRatioCreate, self).get_context_data(**kwargs)
if self.request.POST:
formset = FormulaVariablesFormSet(self.request.POST, instance=self.object)
context['form'] = FormulaForm(formset=formset, data=self.request.POST, instance=self.object)
context['formset'] = formset
else:
formset = FormulaVariablesFormSet(instance=self.object)
context['form'] = FormulaForm(formset=formset, instance=self.object)
context['formset'] = formset
return context
def form_valid(self, form):
context = self.get_context_data()
form = context['form']
formset = context['formset']
if form.is_valid() and formset.is_valid():
ratio = form.save()
formset = FormulaVariablesFormSet(self.request.POST, instance=ratio)
if formset.is_valid():
formset.save()
self.object = ratio
return redirect(self.get_success_url())
context['formset'] = formset
return self.render_to_response(context)
class FormulaForm(forms.ModelForm):
class Meta:
model = Formula
def __init__(self, formset, *args, **kwargs):
self.formset = formset
super(FormulaForm, self).__init__(*args, **kwargs)
def clean(self):
variables = {}
for form in self.formset:
if form.is_valid() and 'formula_variable' in form.cleaned_data:
variables[form.cleaned_data['formula_variable']] = 1
if 'formula' in self.cleaned_data:
formula = self.cleaned_data['formula']
valid, msg = do_formula(formula, variables)
if not valid:
self._errors['formula'] = self.error_class([msg])
del self.cleaned_data['formula']
return self.cleaned_data
FormulaVariablesFormSet = inlineformset_factory(Formula,
FormulaVariable,
extra=1)
表单集:
class FormulaCreate(CreateView):
model = Formula
template_name = "whatever.html"
def get_context_data(self, **kwargs):
context = super(ParameterRatioCreate, self).get_context_data(**kwargs)
if self.request.POST:
formset = FormulaVariablesFormSet(self.request.POST, instance=self.object)
context['form'] = FormulaForm(formset=formset, data=self.request.POST, instance=self.object)
context['formset'] = formset
else:
formset = FormulaVariablesFormSet(instance=self.object)
context['form'] = FormulaForm(formset=formset, instance=self.object)
context['formset'] = formset
return context
def form_valid(self, form):
context = self.get_context_data()
form = context['form']
formset = context['formset']
if form.is_valid() and formset.is_valid():
ratio = form.save()
formset = FormulaVariablesFormSet(self.request.POST, instance=ratio)
if formset.is_valid():
formset.save()
self.object = ratio
return redirect(self.get_success_url())
context['formset'] = formset
return self.render_to_response(context)
class FormulaForm(forms.ModelForm):
class Meta:
model = Formula
def __init__(self, formset, *args, **kwargs):
self.formset = formset
super(FormulaForm, self).__init__(*args, **kwargs)
def clean(self):
variables = {}
for form in self.formset:
if form.is_valid() and 'formula_variable' in form.cleaned_data:
variables[form.cleaned_data['formula_variable']] = 1
if 'formula' in self.cleaned_data:
formula = self.cleaned_data['formula']
valid, msg = do_formula(formula, variables)
if not valid:
self._errors['formula'] = self.error_class([msg])
del self.cleaned_data['formula']
return self.cleaned_data
FormulaVariablesFormSet = inlineformset_factory(Formula,
FormulaVariable,
extra=1)
您是否尝试了
self.add_error('formula','formula not validate')
?我得到了一个AttributeError
,因为self
没有属性add_error