2012-11-30 2 views
9

私は基本的なDjango ModelFormの作成/検証/保存操作を行っています。私のカスタムクリーンメソッドは、Eclipseデバッガの下でコードを実行しているときにis_valid()が呼び出されていて、フォームの作成とis_valid()への呼び出しの後にブレークポイントを設定しても呼び出されません。Django ModelFormはクリーンではない

Djangoベースコードを何度もトレースしており、ModelFormクラスのエラーディクショナリが[なし]に設定されていないことが確認されます。これは、変数ペインに表示するModelFormの_errors属性にアクセスするデバッガとのやりとりが原因であると考えられます。

すべてのブレークポイントを削除してコードを自然に流すと、print文を発行してカスタムクリーンコードが実行されていることを証明できます。

これはEclipseの問題であるDjango ModelFormの設計上の欠陥ですか、間違ったツリーを吠えていますか?

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(データ=行

あり、通常のフォームとこれが動作しない原因となるモデルの形の違いは、おそらくですが、このハックは、(代わりにclean(...)is_valid()をオーバーライド)は私のために働きました) – 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

私は同じ問題があり、少し深く掘り下げてフレームワークをデバッグしようとしました。

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

問題は、まだ作成されていないので、そのメソッドで 'self.cleaned_data []'に触れることができないということです。 –

関連する問題