python - 动态生成 Django 表单类,解决循环导入的最佳方法是什么?

标签 python django forms

我编写了一个简短的片段来在应用程序中动态生成所有模型表单。对我来说,调用此代码片段最合理的位置是在应用程序的 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/

相关文章:

django-rosetta 无法进行 django 翻译

C# - Windows 窗体,用于面板控件的溶解动画

javascript - 在 Javascript 中创建表单-长度未定义

php - MySQL 时间戳字段在表单提交时未更新

python - 如何将当前缓冲区加载到 Emacs 中的 Python 解释器中?

python - 在 Matplotlib 中重置颜色循环

python - 如何在 Python 中从图像读取迷宫并将其转换为二进制值

python - 使用 Django 的用户帐户激活电子邮件

Django:检查实例是否存在于用户数据库中并将其保存到应用程序模型数据库

python - 将行添加到 pandas 中的数据框