2012-11-30 48 views
9

我正在執行基本的Django ModelForm創建/驗證/保存操作。當在Eclipse調試器下運行代碼時調用is_valid()並且在創建表單和調用is_valid()後設置斷點時,我的自定義clean方法未被調用。Django ModelForm不叫乾淨

我已經多次查詢過Django基本代碼,並且似乎ModelForm類中的錯誤字典從未設置爲None,這會觸發驗證。我懷疑這是由於與訪問ModelForm的_errors屬性的調試器進行交互以顯示在變量窗格中。

當我刪除所有斷點並讓代碼自然流動時,我可以通過發出print語句來證明自定義清理代碼正在運行。

這是Django ModelForm設計中的一個缺陷,是一個Eclipse問題還是我吠叫錯誤的樹?

models.py

from django.db import models 

class TestModel1(models.Model): 
    field1 = models.CharField(max_length=45) 
    field2 = models.IntegerField(default=2) 
    field3 = models.CharField(max_length=45, null=True, blank=True) 

forms.py

from order.models import TestModel1 
from django.forms import ModelForm 

class OrderTestForm(ModelForm): 

    def clean_field1(self): 
     return self.cleaned_data['field1'] 

    def clean_field2(self): 
     return self.cleaned_data['field2'] 

    class Meta: 
     model = TestModel1 

我的測試工具:

from forms import OrderTestForm 

row = {'field1': 'test value', 'field2': '4', } 

ff = OrderTestForm(row) 

#ff.full_clean() 
if ff.is_valid(): 
    ff.save() 
else: 
    print ff.errors 
+0

嘗試:FF = OrderTestForm(數據=行) – Brandon

+0

感謝您的建議。我沒有改變就試過了。我應該澄清這個問題。如果我在ModelForm創建和STEP上有一個Eclipse斷點,然後恢復,那麼幹淨的斷點不會被觸發。但是,在我執行第一步之後,清理中的任何打印語句都會打印出來。這意味着,我相信,當Eclipse試圖訪問ModelForm對象來讀取它的屬性時,它會激發乾淨。根據Django文檔,這是預期的行爲。但是,它會產生一個問題,因爲is_valid()將無法正常工作。 –

+0

您可以發佈您的完整測試用例嗎? – Brandon

回答

1

如果你嘗試:

from order.models import TestModel1 
from django.forms import ModelForm 

class OrderTestForm(ModelForm): 
    class Meta: 
     model = TestModel1 

    def clean_field1(self): 
     value = self.cleaned_data['field1'] 
     print value 
     return value 

    def clean_field2(self): 
     value = self.cleaned_data['field2'] 
     print value 
     return value 
+0

我與OP有同樣的問題,並且單個字段清理程序也沒有被調用。 – GreenAsJade

0

我找到了「答案」,這是一種非答案。確切的用例是從客戶接收CSV文件。在檢查了客戶的實際數據文件後,數據字段填充了空格 - 很多空格。我修剪了輸入並將修剪過的字典推入窗體,並且一切正常。仍然沒有解釋爲什麼日食在這個窒息。

0

我有同樣的問題,並試圖深入挖掘和調試框架。

有可能是常規的形式和這將導致此不工作模型形式之間的差異,但這種黑客(覆蓋is_valid()而不是clean(...))工作對我來說:

def is_valid(self): 
    #run whatever ModelForm validations you need 
    return super(OrderTestForm, self).is_valid() 
+0

問題在於,您不能觸摸該方法中的self.cleaned_data []',因爲它尚未創建。 –