2010-05-17 46 views
1

在我的模型我有一個多對多場Django的表格 - 改變渲染多個選擇部件

mentors = models.ManyToManyField(MentorArea, verbose_name='Areas', blank=True) 

在我的形式我想盡可能使這個:

  1. 下拉框列表全部 未有 的MentorArea對象與對象關聯。

  2. 在旁邊的一個添加按鈕,其中 將調用一個JavaScript函數 將其添加到對象。

  3. 然後根據該具有 的UL列表與 每個選定對象MentorArea旁邊有一個X再次調用 javascript函數將 從 對象取出MentorArea。

我知道,改變一個域元素如何呈現您創建一個自定義窗口小部件和覆蓋渲染功能,我這樣做,是創建Add按鈕。

class AreaWidget(widgets.Select): 

    def render(self, name, value, attrs=None, choices=()): 
     jquery = u''' 
     <input class="button def" type="button" value="Add" id="Add Area" />''' 

     output = super(AreaWidget, self).render(name, value, attrs, choices) 

     return output + mark_safe(jquery) 

但是,我不知道如何列出當前選定的下方作爲列表。誰能幫我?還有什麼是過濾列表的最好方法,以便它只顯示尚未添加的MentorArea對象?我目前有該領域

mentors = forms.ModelMultipleChoiceField(queryset=MentorArea.objects.all(), widget = AreaWidget, required=False) 

但這顯示所有導師,無論他們是否已被添加或不。

感謝

回答

1

對於我來說,你所描述的功能聽起來很像你可以使用的ModelAdmin' filter_horizontalfilter_vertical設置實現。 他們渲染的小部件生活在django.contrib.admin.widgets.FilteredSelectMultiple。你應該看看它的代碼!