2011-12-22 88 views
2

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

的代码可能会使它更清晰

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") 

谢谢!

+0

这有什么更新? – fastmultiplication 2012-02-28 08:39:32

+0

您的评论来自一个月前,但我只是回答了这个问题。 – 2012-03-19 17:14:54

回答

4

找到它。人们可以指定的ModelAdmin通过重写“get_changelist_formset”法“change_list”页面上使用的形式: https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L524

+0

你是什么意思?你能给个例子吗? – sha256 2013-04-23 07:40:15

+1

首先 - 编辑链接以转到正确的行。一年多来我没有做过Django,所以我有点生疏。但有两个函数将字段映射到表单,它们是“get_changelist_form”和“get_changelist_formset”。他们默认返回通用表单。你可能会混淆他们来取代你自己的形式。 – 2013-04-23 16:16:52

+0

嘿,谢谢你的回复,我后来发现它自己,但忘了告诉 – sha256 2013-04-23 17:13:25

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

相关问题