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

标签 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 = ['事件']

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

有人可以告诉我如何做到这一点吗?
提前致谢。

最佳答案

好问题!更改列表表单似乎来自 ModelAdmin.get_changelist_form您可以在哪里供应自己的 ModelForm作为模型集的基础模型。

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)

关于django - 如何在列表显示表单上添加自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8964465/

相关文章:

python - 如何在 Django 管理中测试覆盖函数?

Django:在管理多选中显示嵌套类别

django - Django-import-export-从模型的功能导出吗?

Django Admin 样式表不会加载到生产服务器上

django - 在 django-nonrel 中过滤外键属性

python - django的View类是如何工作的

设置 user_permissions 时,Django 用户 get_all_permissions() 为空

sql - django 中的全外连接

python - 如何使用 django 泛型类删除我的帖子?

django - Django消息框架无法在模板循环中工作