2013-04-17 207 views
0

當在我的Django應用程序如何調用只有驗證方法的子集,我使用的模型(我們稱之爲基於myModel),以及一種形式:編輯工作

class Mymodel(models.Model): 
    firstField(...) 
    secondField(...) 

class MymodelAddform(ModelForm): 
    def clean_firstField(self): 
     #stuff 

    def clean_secondField(self): 
     #stuff again 

    def clean(self): 
     #performs stuff with all the fields 

    class Meta: 
     model = Mymodel 

現在我想添加另一種形式, MymodelEditform的基礎上,爲MyModel再次,只用secondField,只有secondField驗證

兩個選項,我認爲(我寫他們兩個不工作):

class MymodelEditform(ModelForm): 
    class Meta: 
     model = Mymodel 
     fields = ['secondField'] 

這裏的問題是,clean_secondField不叫,除非我重新定義它,我想,以避免clean_secondField電話上定義的另一個方法(不過,如果它是唯一的選擇,就這樣吧)

class MymodelEditform(MymodelAddform): 
    class Meta: 
     model = Mymodel 
     fields = ['secondField'] 

這裏的問題是調用clean()驗證,並且由於我只使用了字段的一個子集,所以失敗了。

這個問題很明顯:我如何讓它按預期工作?

回答

0

我還沒有這樣做,但你可以試試這個。

  • 用乾淨的方法創建一個簡單的類。

如下

class MymodelformCleaner(ModelForm): 
    def clean_firstField(self): 
     #stuff 
    def clean_secondField(self): 
     #stuff again 
  • 從該類繼承你的模型形式

您的模型的形式將只定義字段,而清潔的方法是從另一個類

class MymodelAddform(ModelForm, MymodelformCleaner): 
    class Meta: 
     model = Mymodel 

class MymodelEditform(ModelForm, MymodelformCleaner): 
    class Meta: 
     model = Mymodel 
     fields = ['secondField'] 
+0

好吧,我沒有看到第二個選項我展示的區別是:所有的驗證方法總會被調用,而不僅僅是與'secondField'有關的一些# –

+0

不,我不這麼認爲。按照你的方式,你從'MymodelAddform'派生出來,它具有所有的字段,並且可能對這些字段調用乾淨。你可能想要檢查'Meta'類如何與繼承一起工作。在我的情況下,第二種形式只有一個字段,所以應該只調用其乾淨的方法。 – Rohan

+0

明確指定要包含的字段已經做了你所建議的(它只調用與你包含的字段相關的驗證方法)。但是我沒有對我遇到的問題進行足夠的測試,使我感到困惑。我編輯了我的問題(實際上,還有另一個clean()方法) –

0

一個明顯的解決方案wo應該定義clean_secondFieldMymodelEditform中並且使MyModelAddForm繼承自MymodelEditForm,但它可能無法按預期工作。另一個解決方案是使這兩個表單都從定義clean_secondField的通用基本形式繼承。

或者你可以明確地排除在窗體的元場(CF https://code.djangoproject.com/ticket/12901

+0

我的確在表單的meta中排除了字段,但我只注意到我還聲明瞭一個使用我的模型中大多數字段的clean()方法。正是這種乾淨()方法打破了事情(而不是,正如我首先想到的那樣,clean_firstfield)。有沒有辦法不包括它,當我從addform繼承editform?正如你所說,其他解決方案顯而易見,但它需要在不同的地方放置應該(IMO)在同一地點的代碼。 –

+0

通常的解決方案是TemplateMethod模式......哦,等等......'form.clean_XXX'實際上是TemplateMethod模式的一個實現。爲什麼不使用它並將'secondField'的驗證邏輯放在'clean_secondField'中? 更嚴重:你有什麼理由使用兩種不同的形式?我的意思是除了隱藏幾個字段? –

+0

secondField的整個驗證邏輯已經在clean_secondField中。問題在於調用了clean()方法,並且這個方法按照django的文檔建議的方式執行其他字段的驗證(https://docs.djangoproject.com/en/1.5/ref/forms/validation/#清潔和驗證領域 - 相互依賴)。不,除了隱藏大部分字段之外,我沒有其他理由使用兩種不同的形式。但我認爲這是唯一的方法:我怎麼能沒有兩種形式呢? –