Django访问数据传递给表单

时间:2010-06-16 15:23:17

标签: python django forms django-forms django-models

我的表单中有一个choiceField,我在其中显示过滤后的数据。要过滤数据,我需要两个参数。第一个不是问题,因为我可以直接从一个对象获取它,但第二个是动态生成的。这是一些代码:

class GroupAdd(forms.Form):
    def __init__(self, *args, **kwargs):
        self.pid = kwargs.pop('parent_id', None)

        super(GroupAdd, self).__init__(*args, **kwargs)

    parent_id = forms.IntegerField(widget=forms.HiddenInput)
    choices = forms.ChoiceField(
        choices = [
            [group.node_id, group.name] for group in Objtree.objects.filter(
                 type_id = ObjtreeTypes.objects.values_list('type_id').filter(name = 'group'), 
                 parent_id = 50
            ).distinct()] + [[0, 'Add a new one']
        ], 
        widget = forms.Select(
            attrs = {
                'id': 'group_select'
            }
        )
     )

我想更改传递给Objtree.objects.filter的parent_id。你可以看到我在init函数中尝试过kwargs['initial']['parent_id'],然后用self调用它,但这不起作用,因为它超出范围......这几乎是我最后的努力。我需要通过initial参数或直接通过parent_id字段来处理它,因为它已经保持其值(通过initial传递)。

任何帮助都表示赞赏,因为我的想法已经用完了。

1 个答案:

答案 0 :(得分:2)

在我回答你的问题之前,请先确定几个小问题。

首先,你的字段可能应该是ModelChoiceField - 这需要一个queryset参数,而不是一个选项列表,这样就不需要列表理解来获取id和value。

其次,使用双下划线表示法来描述获取Objtree对象的查询要好得多,以便遍历关系:

Objtree.objects.filter(type__name='group', parent_id=50)

现在,实际的问题。如您所知,您无法在字段声明中访问本地或实例变量。这些是类级属性,在定义类时(而不是在实例化时)处理(通过元类)。所以你需要在__init__中完成整个事情。

像这样:

class GroupAdd(forms.Form):
    parent_id = forms.IntegerField(widget=forms.HiddenInput)
    choices = forms.ModelChoiceField(queryset=None)

    def __init__(self, *args, **kwargs):
        pid = kwargs.pop('parent_id', None)
        super(GroupAdd, self).__init__(*args, **kwargs)
        self.fields['choices'].queryset = Objtree.objects.filter(
                                              type__name='group', parent_id=pid
                                          )