9

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

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)

フォーム.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
4

3 に答える 3

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
于 2012-11-30T18:47:37.850 に答える
0

私は一種の非答えである「答え」を見つけました。正確な使用例は、顧客からCSVファイルを受信することでした。顧客の実際のデータファイルを調べた後、データフィールドにはスペース(多くのスペース)が埋め込まれました。私は入力をトリミングし、そのトリミングされた辞書をフォームに押し込み、すべてが機能しました。なぜ日食がこれを窒息させたのかはまだ説明されていません。

于 2012-12-26T14:01:41.587 に答える
0

私は同じ問題を抱えていたので、もう少し掘り下げてフレームワークをデバッグしようとしました。

通常のフォームとモデル フォームの間にはおそらく違いがあり、これが機能しない原因となりますが、このハック (is_valid()の代わりにオーバーライドclean(...)) は私にとってはうまくいきました:

def is_valid(self):
    #run whatever ModelForm validations you need
    return super(OrderTestForm, self).is_valid()
于 2013-02-04T18:15:02.357 に答える