class Test(forms.Form):
def set_choices(self, choices):
self.choices = choices
def get_choices(self):
return self.choices
options = forms.ChoiceField(choices=get_choices())
f = Test()
f.set_choices(...)
为什么这不可能?
我怎样才能实现将数据传递到Class Test的目标?
提前谢谢。
答案 0 :(得分:10)
这是一个基本的Python问题。您需要考虑这些命令的执行顺序及其范围。
首先,定义一个名为Test的表单类。该类有三个属性:set_choices
方法,get_choices
方法和options
字段。定义类本身时,将评估这些定义。 options
调用get_choices()
的定义。但是,此时范围内没有get_choices
方法,因为尚未定义类。
即使你以某种方式设法解决了范围问题,这仍然无法做到你想要的,因为options
的选择定义是在定义时完成的。即使您稍后致电set_choices
,options
仍然具有定义字段时返回的get_choices
值。
那么,你真的想做什么?您似乎想在options
字段上设置动态选择。因此,您应该覆盖__init__
方法并在那里定义它们。
class Test(forms.Form):
options = forms.ChoiceField(choices=())
def __init__(self, *args, **kwargs):
choices = kwargs.pop('choices', None)
super(Test, self).__init__(*args, **kwargs)
if choices is not None:
self.fields['options'].choices = choices
答案 1 :(得分:0)
扩展__init__
是动态添加ChoiceField
选项的好方法,正如Daniel Roseman在his answer中解释的那样。
只是为了增加...在运行时添加选项是hackish(充其量)。以下是关于最佳实践的说明(直接来自Django ChoiceField documentation) -
最后,请注意选择可以是任何选择 可迭代对象 - 不一定是 列表或元组。这可以让你构建 动态选择。但如果你找到了 自己黑客入选 动态,你可能会更好 使用适当的数据库表 ForeignKey的。选择是为了 静态数据变化不大, 如果有的话。