我有一个 bind_form
自定义装饰器,它将指定的 django 表单分配给一个函数。此装饰器将允许对函数参数“自动”执行验证 - 例如,检查 age
是否在要求的范围内,或检查用户是否存在。这样做是出于 DRY 原因。
装饰器中引用的每个表单都存在于 forms
模块中。
此表单验证的示例可以是 users.check_user_exists
- 因此我必须在 form
模块中导入 users
模块。
所以,现在您看到我有 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
模块中有很多表单。users
模块中的许多函数都附有验证表单。- 验证表单使用了来自
users
和其他模块的许多功能。
换种方式解释:
一个。 forms
在 forms
模块的第 4 行导入 users
users.create_user
引用 forms.Create_User
forms
还不知道 Create_User
因为它是在 forms
模块的第 5 行声明的
最佳答案
循环依赖的诀窍是在全局范围内分隔语句,这样所有不引用从其他模块导入的任何符号的语句都在您导入它之前发生。例如……
表单.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):
...
Create_User.clean()
方法中users
符号的使用不在全局范围内,所以实际上不需要定义符号直到函数被实际调用为止。
关于python - 相互依赖的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16001739/