2

我有一个bind_form自定义装饰器,它将指定的 django 表单分配给一个函数。此装饰器将允许对函数参数“自动”执行验证 - 例如,检查是否age在所需范围内,或检查用户是否存在。这样做是出于 DRY 的原因。

装饰器中引用的每个表单都存在于forms模块中。

这种表单验证的一个例子可能是users.check_user_exists- 因此我必须在users模块中导入form模块。

所以,现在你看到我有forms模块,导入users模块以便users.user_exists可以引用,但users导入forms模块以便可以在表单装饰器中使用表单:

表格.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):
           ...

用户.py:

import forms

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

因此,一旦users导入,就会users尝试引用bind_form,但这还没有被forms.

这是我的设计缺陷,还是我遗漏了一些简单的东西?如果有设计缺陷 - 欢迎提出改进建议。

** 约束:**

  • 模块中有多种形式forms
  • users模块中有许多附加了验证表单的函数。
  • 验证表单使用来自users和其他模块的许多功能。

换一种方式解释:

一种。在模块的第 4 行forms导入usersforms

湾。users.create_user参考forms.Create_User

C。还不forms知道,因为它是在模块的第 5 行声明的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

用户.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 回答