将数据传递到django表单

时间:2011-04-21 12:49:40

标签: python django

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的目标? 提前谢谢。

2 个答案:

答案 0 :(得分:10)

这是一个基本的Python问题。您需要考虑这些命令的执行顺序及其范围。

首先,定义一个名为Test的表单类。该类有三个属性:set_choices方法,get_choices方法和options字段。定义类本身时,将评估这些定义。 options调用get_choices()的定义。但是,此时范围内没有get_choices方法,因为尚未定义类。

即使你以某种方式设法解决了范围问题,这仍然无法做到你想要的,因为options的选择定义是在定义时完成的。即使您稍后致电set_choicesoptions仍然具有定义字段时返回的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的。选择是为了   静态数据变化不大,   如果有的话。