我有一个内联formset。内联模型的1个属性是布尔值。我希望在任何时候只保留其中一个为True。如何实现这一目标。我试过了:
class AmodelFormSet(BaseInlineFormSet):
model = Amodel
def clean(self):
for form in self.forms:
if form.instance.current: #current is the boolean attribute
try:
temp = Amodel.objects.filter(current=True)
if form.instance not in temp:
for t in temp:
t.current = False
t.save()
except Amodel.DoesNotExist:
pass
有了这个,我只能在保存的表单具有布尔值时才能获得。但是现有的形式如果超过1个值被设置为“真实”,则两者都得到布尔'真'而要求是只将其中一个设置为True。我无法为此提出异常。我怎样才能做到这一点? Django v.1.6.5
答案 0 :(得分:1)
您对BaseFormset
进行子类化并添加the comment的方法看起来不错。您应该检查表单cleaned_data
的内容,而不是从数据库中获取值。
class MyBaseFormSet(BaseFormSet):
def clean(self):
"""Checks that only one instance is current"""
if any(self.errors):
# Don't bother validating the formset unless each form is valid on its own
return
count = 0
for form in self.forms:
if form.cleaned_data['current']:
count += 1
if count > 1:
raise forms.ValidationError("Only one item can be current")
然后使用modelformset_factory
from django.forms.models import modelformset_factory
MyFormSet = modelformset_factory(MyModel, formset=MyBaseFormSet)