Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django InlineFormSet验证_Django_Django Forms - Fatal编程技术网

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
    ModelForm
    有一个干净的方法来执行main
    Model
    实例的验证
  • ModelAdmin
    可以访问
    InlineFormset
    s()
  • ModelForm
    无权访问
    ModelAdmin
    ModelAdmin
    的表单集(因此它的clean方法无法交叉验证内联线)
  • 内联线的
    BaseModelFormSet
    BaseInlineFormSet
    扩展
    BaseModelFormSet
    )具有
    clean
    方法(请参阅),但无法以任何方式访问主
    Model
    实例
因此,您需要做的是使用前两个链接作为指导进行一些黑客攻击。

多亏了,我成功地解决了这个问题。我在这里详细说明答案,以供将来参考

我做错了,InlineFormSet不是我需要的那种验证的正确位置,它应该在父模型表单中完成。但是父模型表单没有访问子表单集的权限,所以我只需要将表单集作为参数传递给模型表单。现在的情况是这样的:

视图:

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