如何在列表显示表单上添加自定义验证

时间:2012-01-22 20:36:01

标签: django django-admin

我有一个模型,其中可以选择设置元素是否有效。

对于具有“True”值的“active”属性的元素数量有限制。

我在AdminModel上编写了验证码。所以现在如果在编辑元素时我将其标记为“活动”并且我已达到“actvie”元素的限制,我会引发异常。

def clean_active(self):
  if self.cleaned_data["active"]:
       #check number of active elements in model.

在管理界面中,我还有一个对象列表。 在此列表中,我将“活动”字段标记为可编辑,     list_display =('name','first_promotion','second_promotion','active')     readonly_fields = ['name']     list_editable = ['active']

我想要的是能够在模型的“列表显示”上进行此验证。 我无法在哪里添加列表显示的验证码。

有人能告诉我怎么做吗? 提前谢谢。

1 个答案:

答案 0 :(得分:5)

好问题!更改列表表单似乎是从ModelAdmin.get_changelist_form提取的,您可以在其中提供自己的ModelForm作为modelformset基本模型。

class MyForm(forms.ModelForm):
    def clean_active(self):
        cd = self.cleaned_data.get('active')
        limit = 5 # replace with logic
        if cd >= limit:
            raise forms.ValidationError("Reached limit")
        return cd

    class Meta:
        model = MyModel

class MyModelAdmin(admin.ModelAdmin):
    def get_changelist_form(self, request, **kwargs):
        return MyForm

如果要修改表单集验证(表单集合),则覆盖get_changelist_formset

from django.forms.models import BaseModelFormSet

class BaseFormSet(BaseModelFormSet):
    def clean(self):
        print self.cleaned_data 
        # this is the cleaned data for ALL forms.
        if 'your_condition': 
            raise forms.ValidationError("Your error")

        return self.cleaned_data

class MyModelAdmin(admin.ModelAdmin):
    def get_changelist_formset(self, request, **kwargs):
        kwargs['formset'] = BaseFormSet
        return super(MyModelAdmin, self).get_changelist_formset(request, **kwargs)
相关问题