访问第二个表单中的一个表单的清理数据

时间:2018-11-08 01:37:16

标签: python django django-forms

所以我有两种形式,Sale和SaleItems

SaleForm = SaleForm(request.POST or None, auto_id=False, prefix = 'SaleForm')
SaleItemsForm = modelformset_factory(
        Sale, form = SaleItemsForm, formset = ItemsFormSet, extra=1, can_delete=True
)

一旦它们都获得了POST数据并且有效,它们就会出现在通常的语句中:

if SaleForm.is_valid() and SaleItemsForm.is_valid():
    pass

当需要进行验证时,我已取代了basemodelformset,并想为modelformset编写自己的自定义清洁方法。我想在ItemsFormSet的clean方法内使用SaleForm中的清除数据:

from django import forms

class ItemsFormSet(forms.models.BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(ItemsFormSet, self).__init__(*args, **kwargs)

    def clean(self):
        super().clean()
        print(TheSaleForm.cleaned_data['Value'])

这不起作用,我尝试了一些愚蠢的事情:

  • 尝试将SaleForm设为全局,并在views.py和Forms.py模块之间进行访问。那是个坏主意,现在我对模块范围有了更多了解

  • 尝试导入实际对象,同样不明智

我假设必须要有一种方法,而不必将已清理的数据保存到数据库的某个位置,而是以formset的clean方法再次检索它。我不确定是否覆盖ItemsFormSet.is_valid()并尝试允许通过kwarg词典项是正确的方法。...但是我希望有人对“正确”的想法有所了解解决这个问题的方法是

1 个答案:

答案 0 :(得分:1)

您应该允许将数据传递到ItemsFormSet的初始化中,并将其保留为实例属性,以备日后参考。

class ItemsFormSet(forms.models.BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        self.sale_form = kwargs.pop('sale_form', None)
        super(ItemsFormSet, self).__init__(*args, **kwargs)

    def clean(self):
        super().clean()
        print(self.sale_form.cleaned_data['Value'])

现在在您的视图中:

if request.method == 'POST':
    form = SaleForm(request.POST)
    formset = SaleItemsForm(request.POST, sale_form=form)