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

san*_*dok 4 django django-admin

我有一个模型,其中是一个选项,用于设置元素是否有效.

对具有"True"值的"active"属性的元素数量有限制.

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

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

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

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

谁能告诉我怎么做?提前致谢.

Yuj*_*ita 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
Run Code Online (Sandbox Code Playgroud)

如果要修改表单集验证(表单集合),则覆盖 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)
Run Code Online (Sandbox Code Playgroud)