3

私が取り組んでいるDjangoプロジェクトでは、次のようにビューにフォームをインポートします

#views.py
from forms import SomeForm

それから私が持っているテストファイルで

#form_test.py
from app.forms import SomeForm    
.
.
.
self.assertTrue(isinstance(response.context['form'], SomeForm))

isinstanceが機能しないのはなぜですか?

type()の出力を2つのオブジェクトについて調べると、次のようになります。

response.contextフォーム:期待されるフォーム:

これは、views.pyのインポートメカニズムをform_test.pyのインポートメカニズムと一致させることで修正できますが、これは間違ったアプローチのようです。

参考までに、ファイル構造は次のとおりです。

  • サイト/
    • manage.py
    • アプリ/
      • forms.py
      • views.py
      • テスト/
        • form_test.py
4

2 に答える 2

7

isinstanceまた、モジュールの場所を比較します。response.context['form']クラスのモジュールはforms、SomeFormモジュールであり、それぞれと app.formsを調べてこれを確認します。__class__.__module____module__

isinstanceを機能させるには、次のことができます。

  • views.pyのインポートを修正します(推奨)
  • form_testse.pyのsys.pathを変更して、フォームからフォームをインポートできるようにします。
  • パッケージ内参照を試す
于 2012-01-25T17:10:06.703 に答える
0

考えられるハックの1つ__name__は、型の属性を確認することですが、正しい方法で修正しない限り、他の問題が発生する可能性があります。

def sharetypename(obj1, obj2):
    if isinstance(obj1, type):
        c1 = obj1.__name__
    else:
        c1 = type(obj1).__name__

    if isinstance(obj2, type):
        c2 = obj2.__name__
    else:
        c2 = type(obj2).__name__

    return c1 == c2
于 2015-08-19T22:08:55.227 に答える