2010-06-16 99 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