2012-05-17 127 views
5

我想在管理員驗證之前填充字段。如何爲管理網站創建自定義清理方法?

models.py

class Ad(models.Model): 
    ..... 
    manual_code = models.BooleanField("Manual Code", default=False) 
    code   = models.TextField("Code") 

admin.py

class MyAdAdminForm(forms.ModelForm): 
    class Meta: 
     model = Ad 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     cleaned_data['code'] = "dadad" 
     print cleaned_data 
     return cleaned_data 

class AdAdmin(admin.ModelAdmin): 
    form = MyAdAdminForm 

admin.site.register(Ad, AdAdmin) 

最終我想生成整個「代碼」字段中,但我仍然獲得在管理的錯誤,該字段爲空儘管我可以在shell中看到它的價值(「dadad」)。

我也試過

def clean_code(self): 

,並沒有調用該函數在所有。

,我也試過

def save_model(request,....): 
在AdAdmin類

但它不叫,要麼。

那麼我該怎麼辦?

+0

不應該乾淨()有一個級別的縮進是MyAdAdminForm的一部分? – jpic

+0

它在我的代碼中,我會在這裏更正它。 –

回答

2

除了調用您自定義的clean方法外,Django還會分別驗證每個表單字段。這是導致所需字段錯誤的單個字段檢查。有關完整的詳細信息,請參閱Form and field validation上的Django文檔。

如果在代碼字段中不需要用戶輸入,則可以覆蓋表單的__init__方法,並設置required=False

class MyAdAdminForm(forms.ModelForm): 
    class Meta: 
     model = Ad 

    def __init__(self, *args, **kwargs): 
     super(MyAdAdminForm, self).__init__(*args, **kwargs) 
     self.fields['code'].required = False 

一旦不需要領域,形式驗證過程中調用clean_code方法,這樣你就可以設置的值存在。

+0

我想保持所需的領域。那是整個問題。 –

+0

據我所知,你會自動生成'code'字段的值,所以你不需要用戶輸入代碼。因此對於這種形式所要求的應該是錯誤的如果您確實需要用戶輸入值,那麼當用戶未輸入值時顯示錯誤似乎是正確的行爲。 – Alasdair

+0

如果選中'manual_code',我可能不會生成該字段的值。所以如果用戶檢查它並且沒有爲'code'插入任何值,它應該向它們返回一個錯誤。 –

相關問題