2

bind_form指定された django フォームを関数に割り当てるカスタム デコレータがあります。このデコレーターを使用すると、関数の引数に対して検証を「自動的に」実行できます。たとえば、age必要な範囲内にあるかどうかを確認したり、ユーザーが存在することを確認したりします。これは DRY の理由で行われます。

デコレーターで参照される各フォームは、formsモジュール内に存在します。

このフォーム検証の例としては、次のようなものがあります。users.check_user_existsしたがって、usersモジュールをモジュールにインポートする必要がありformます。

これで、モジュールformsをインポートして参照できるようになりましたが、モジュールをインポートしてフォームをフォーム デコレータで使用できるようになりました。usersusers.user_existsusersforms

フォーム.py:

import users

def bind_form(func):
    # binds form to function
    ...

class Create_User(Forms.Form):
    # validated create_user function
    ...
    def clean(self): #using for validation
        if users.user_exists(user):
           ...

users.py:

import forms

@forms.bind_form(form=forms.Create_User)
def create_user(**kwargs):
    ...

usersそのため、がインポートされるとすぐにusersを参照しようとしますbind_formが、これは によってまだ「認識」されていませんforms

これは私の設計上の欠陥ですか、それとも単純なものが欠けていますか? 設計上の欠陥の場合 - 改善のための提案を歓迎します。

** 制約:**

  • モジュールには多くのフォームがありformsます。
  • usersモジュールには、検証フォームが添付された多くの関数があります。
  • 検証フォームはusers、 やその他のモジュールの多くの機能を使用します。

別の方法で説明します:

を。モジュールの 4 行目でformsimportusersforms

b. users.create_user参考文献forms.Create_User

c. モジュールの5行目で宣言されているため、まだforms知りませんCreate_Userforms

4

1 に答える 1

1

循環依存関係の秘訣は、ステートメントをグローバルスコープで分離することです。これにより、他のモジュールからインポートされたシンボルを参照しないすべてのステートメントが、インポートする前にすべて発生します。例えば...

フォーム.py:

# This statement doesn't reference 'users' at compile time
def bind_form(func):
    ...

# This statement doesn't reference 'users' at compile time
class Create_User(Forms.Form):

    # This statement declares a new scope
    def clean(self):

        # This statement references 'users' at runtime, but not at compile time
        if users.user_exists(user):
            ...

# Now import
import users

users.py:

# Import
import forms

# This statement references 'forms' at compile time
@forms.bind_form(form=forms.Create_User)
def create_user(**kwargs):
    ...

usersメソッド内でのシンボルの使用はCreate_User.clean()グローバル スコープ内ではないため、関数が実際に呼び出される時点までシンボルを定義する必要はありません。

于 2013-04-14T17:50:25.337 に答える