我对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的一个非常古老的版本)。
答案 0 :(得分:1)
我道歉 - 这段代码按预期工作。我重构了我的真实代码以使用这种模式,这次它起作用了。我一定有别的错误。