【问题标题】:How to add custom validation on a list display form如何在列表显示表单上添加自定义验证
【发布时间】:2012-01-22 20:36:01
【问题描述】:

我有一个模型,其中 是用于设置元素是否处于活动状态的选项。

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

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

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 = ['名称'] list_editable= ['活动']

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

谁能告诉我如何做到这一点? 提前致谢。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    好问题!更改列表表单似乎是从 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)
    

    【讨论】:

    • 非常感谢。这是一个非常快速的答案,并且有效。我使用了在单个对象管理中使用的相同“模型形式”,它似乎可以工作。现在我在每个处于活动状态的字段中都有一个错误(一旦我超过了限制)。我想我可以这样做,所以我只在我刚刚编辑的行中显示一个错误
    • 您知道在验证“活动”期间如何检查值“true”或“false”是否与保存的值相同或更改?
    • 我可能只是与数据库进行比较...if self.instance.id: changed = self.model.objects.get(id=self.instance.id).active != self.cleaned_data.get('active') 因为 IIRC 模型不执行 GET,它们只是开始直接从发布的数据中填充值...
    • 这看起来像个问题 :) 。一切正常,直到您在一次提交中设置让 seid ...3 超过限制。在这种情况下,表格不会对此提出投诉......是否可以在“clean_active”中保留一个计数器?
    • 嗯?这很奇怪 - 如果表单集中的任何表单无效,则整个表单集都是无效的。你需要想出你的具体逻辑。我不确定您的限制是如何确定的。
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2019-07-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多