2011-12-22 91 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

相關問題