所以我有两种形式,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词典项是正确的方法。...但是我希望有人对“正确”的想法有所了解解决这个问题的方法是
答案 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)