我有一个模型,其中可以选择设置元素是否有效。
对于具有“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']
我想要的是能够在模型的“列表显示”上进行此验证。 我无法在哪里添加列表显示的验证码。
有人能告诉我怎么做吗? 提前谢谢。
答案 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)