生成Django动态表单时如何从同一文件中的类继承

时间:2013-12-27 00:23:46

标签: python django

我对Python和Django都很陌生,而且我正在构建一个小型网站。我一直在尝试一个动态表单,其中包含一个由ModelChoiceField构造的QuerySet,由用户输入决定。所描述的方法here对我很有用,但如果我尝试动态创建一个继承自我在同一文件中定义的类的类型,我会遇到麻烦。我试图这样做的原因是我想通过设置表单的fields.keyOrder属性来覆盖默认的表单字段顺序。

这就是我尝试这样做的方式:

from django import forms

class AbstractForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(AbstractForm, self).__init__(*args, **kwargs)
        self.fields.keyOrder = ['choices', 'second', 'third']

class ConcreteFormFactory(object):
    @staticmethod
    def generate(queryset):
        properties = {
            'second': forms.CharField(),
            'third': forms.CharField(),
            'choices': forms.ModelChoiceField(queryset=queryset)
        }
        return type('ConcreteForm', (AbstractForm,), properties)

但是,当我在视图中导入ConcreteFormFactory并尝试调用其generate()方法时,我得到一个NameError,告诉我没有定义AbstractForm。我尝试将AbstractForm导入调用上下文,但无济于事。由于我无法使用这种方法,我以另一种方式完成了我的目标,但我仍然希望了解这里的范围问题。如何让我的动态类知道在我创建它的同一文件中定义的其他类?这是关于Django 1.2和Python 2.7.1(我知道这是Django的一个非常古老的版本)。

1 个答案:

答案 0 :(得分:1)

我道歉 - 这段代码按预期工作。我重构了我的真实代码以使用这种模式,这次它起作用了。我一定有别的错误。