我有一个bind_form
自定义装饰器,它将指定的django表单分配给一个函数。该装饰器将允许在函数参数上“自动”执行验证 - 例如,检查age
是否在所需范围内,或检查该用户是否存在。这是出于干燥的原因。
装饰器中引用的每个表单都存在于forms
模块中。
此表单验证的示例可能是users.check_user_exists
- 因此我必须在users
模块中导入form
模块。
所以,现在您看到我有forms
模块,导入users
模块,因此可以引用users.user_exists
,但users
导入forms
模块,因此表单可以在表单装饰器中使用:
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):
...
users.py:
import forms
@forms.bind_form(form=forms.Create_User)
def create_user(**kwargs):
...
导入users
后,users
会尝试引用bind_form
,但forms
尚未“看到”。
这是我的设计缺陷,还是我错过了一些简单的东西?如果设计缺陷 - 建议欢迎改进。
**约束:**
forms
模块中有许多表单。users
模块中有许多附加了验证表单的函数。users
和其他模块中的许多函数。以另一种方式解释:
一个。 forms
在users
模块
forms
湾users.create_user
引用forms.Create_User
℃。 forms
不知道Create_User
但是因为它已在forms
模块的第5行声明
答案 0 :(得分:1)
循环依赖的技巧是分离全局范围中的语句,这样所有不引用从其他模块导入的符号的语句都会在导入之前发生。例如......
<强> forms.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()
符号的使用不在全局范围内,因此实际上不需要定义符号直到实际调用该函数的点。