django inlineformset,如何一次只允许1个布尔字段为真?

时间:2015-07-15 08:39:15

标签: python django

我有一个内联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

1 个答案:

答案 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

创建模型formset
from django.forms.models import modelformset_factory
MyFormSet = modelformset_factory(MyModel, formset=MyBaseFormSet)