我编写了一个简短的片段来在应用程序中动态生成所有模型表单。对我来说,调用此代码片段最合理的位置是在应用程序的 forms.py 中。但这会导致循环导入,因为我试图在调用我的模块中设置属性,但它还不存在。有没有一种优雅的方法来解决这个问题?
#bomgar.forms.py
import base.forms
import bomgar # bomgar is myapp
base.forms.generate_base_forms(bomgar)
#base.forms.py
from django.db import models
from django import forms
import inspect
class BaseForm(forms.ModelForm):
error_css_class = 'error'
required_css_class = 'required'
class Meta:
model=None
''' Generates a base set of forms to work off of. So I dont have to
make a billion of them by hand to start off. '''
def generate_base_forms(module):
__import__('%s.models' % module.__name__)
__import__('%s.forms' % module.__name__)
for model_name, model_class in inspect.getmembers(module.models):
if inspect.isclass(model_class):
if model_class._meta.abstract == False:
form_name=model_name+'Form'
class ModelMeta(BaseForm.Meta):
model=model_class
form_class=type(form_name,(BaseForm,), { 'Meta': ModelMeta })
setattr(module.forms, form_name, form_class)
终端输出
(env)Macbook:djinmanage me$ ./manage shell
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import bomgar.models
>>> import bomgar.forms
<module 'bomgar.models' from '/Users/me/Sites/djinmanage/djinmanage/bomgar/models.pyc'>
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/me/Sites/djinmanage/djinmanage/bomgar/forms.py", line 4, in <module>
base.forms.generate_base_forms(bomgar)
File "/Users/me/Sites/djinmanage/djinmanage/base/forms.py", line 19, in generate_base_forms
print module.forms
AttributeError: 'module' object has no attribute 'forms'
>>>
最佳答案
在绑定(bind)所有必需的名称后,在模块的末尾调用函数生成表单。
编辑:
好的,您已导入它们。但你让进口产品掉到了地板上。
impmodule = __import__('%s.models' % module.__name__)
__import__('%s.forms' % module.__name__)
...
setattr(impmodule.forms, form_name, form_class)
(您不需要捕获第二个 __import__
的结果,因为它们都是同一模块。)
关于python - 动态生成 Django 表单类,解决循环导入的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9108828/