admin中的list_editable字段的自定义验证

时间:2011-12-22 02:35:34

标签: django

我有一个带自定义验证的管理表单。某些表单字段通过list_editable显示在列表视图中。当我通过列表视图修改这些字段时,自定义验证不起作用。但是,当我使用常规更改表单时,它确实有效。所以问题是如何通过“change_list”页面验证所做的更改。

代码可能会更清晰

class ProjectForm(ModelForm):
    class Meta:
        model = Project
    def clean(self):
        print "validating!"
        data = self.cleaned_data
        if data.get('on_frontpage') and not data.get('frontpage_image'):
            raise ValidationError('To put a project on the frontpage you must \
                                specify a "Frontpage image" first.')
        return data

class ProjectAdmin(AdminImageMixin, DisplayableAdmin, SortableAdmin):
    form = ProjectForm
    ...
    list_editable = ("status", "on_frontpage",)
    list_display = ("title", "status", "on_frontpage")

谢谢!

3 个答案:

答案 0 :(得分:4)

找到它。可以通过覆盖ModelAdmin中的“get_changelist_formset”方法来指定“change_list”页面上使用的表单: https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L524

答案 1 :(得分:0)

覆盖ModelAdmin.get_changelist_formset(request, **kwargs)方法:

from django.forms import BaseModelFormSet

class MyAdminFormSet(BaseModelFormSet):
    pass

class MyModelAdmin(admin.ModelAdmin):
    def get_changelist_formset(self, request, **kwargs):
        kwargs['formset'] = MyAdminFormSet
        return super().get_changelist_formset(request, **kwargs)

有关详细信息,请查看Django admin site documentation

答案 2 :(得分:0)

我认为@Jorge Barata是正确的answer,非常感谢。

请允许我在此处附上成功示例。

class MyAdminFormSet(BaseModelFormSet):
    def clean(self):
        form_set = self.cleaned_data
        for form_data in form_set:
            if form_data['field1'] != form_data['field2']:
                raise forms.ValidationError(f'Item: {form_data["id"]} is not valid')

        return form_set    
  

在Django 2.2上测试