2010-06-16 91 views
0

我的表单中有choiceField,我显示过滤的数据。要过滤数据,我需要两个参数。第一个不是问题,因为我可以直接从一个对象中取出它,但第二个是动态生成的。下面是一些代码:Django访问数据传递给表单

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)。

任何帮助表示赞赏,因为我没有想法。

回答

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 
             ) 
+0

谢谢,这个工作就像一个魅力,但因为有'Objtree'和'ObjtreeTypes'没有关系,我不能使用'type__name ='group''。我可以添加一个前卫的钥匙,但现在并不需要。 +1 – realshadow 2010-06-16 16:48:06