2010-09-01 54 views
4

當我顯示ToolBoxEditForm時,它使用了一個多選字段。 但我想要的是一種讓用戶可以在工具箱中將每個工具編輯爲文本字段的形式。我無法弄清楚如何在多對多領域做到這一點。如何在多對多的情況下將多個選擇字段更改爲多個輸入字段?

class Tool(models.Model): 
    tool_name = models.CharField(unique=True, max_length=200) 
...... 

class ToolBox(models.Model): 
    tools = models.ManyToManyField(Tool,max_length=300) 

class ToolBoxEditForm (ModelForm): 
    tools = ??? 
    class Meta: 
     model = ToolBox 
     exclude = ('user', 'popularity',) 

回答

2

最性感的解決方案

你可以使用這裏描述了jQuery autocommplete工具之一:Facebook style JQuery autocomplete plugin

然後形式:

class ToolBoxEditForm (ModelForm): 
    tools = forms.CharField(widget=forms.Textarea, required=False) 

    def clean_tools(self): 
     tool_data = self.cleaned_data.get('tools',None) 
     tools = [] 
     #here, a comma is used a delim, so it's not allowed in the tool name. 
     for td in tool_data.split(','): 
      t, _ = Tool.objects.get_or_create(name=td) 
      tools.append(t) 
     return tools 

    class Meta: 
     model = ToolBox 
     exclude = ('user', 'popularity',) 

你必須弄清楚如何修改JavaScript,以便可以輸入新項目(即不只是es已經在數據庫中)。

替代解決方案

這有點什麼inline formsets被用於創建,因此Narendra's solution會奏效。

喜歡的東西:

from django.forms.models import inlineformset_factory 

def manage_toolbox(request, toolbox_id): 
    toolbox = Toolbox.objects.get(pk=toolbox_id) 
    ToolInlineFormSet = inlineformset_factory(Toolbox, Tool) 
    if request.method == "POST": 
     formset = ToolInlineFormSet(request.POST, request.FILES, instance=toolbox) 
     if formset.is_valid(): 
      formset.save() 
      # Do something. 
    else: 
     formset = ToolInlineFormSet(instance=toolbox) 
    return render_to_response("manage_toolbox.html", { 
     "formset": formset, 
    }) 

這並不是說這種形式是隻用於編輯工具箱內的物品。如果您希望用戶能夠編輯工具箱的其他方面 - 例如其名稱或描述 - 您可以創建一個單獨的表單並在同一個<form></form>標籤內輸出它們。

+0

這正是我最終做的!我使用jquery方法。它的作品非常漂亮。謝謝! – adeleinr 2010-10-14 23:15:46

0

我不確定,因爲沒有測試它,但這裏是邏輯。

  1. 創建通過formset_factory
  2. 變化tool_name字段類型表單集的ToolBoxEditForm到CharField
  3. 在表單集的行集數以dB爲單位精確對象工具的數量可用
  4. 通行證的首字母來FORMSET構造填寫tool_name文本框。

    #TODO:下列數據必須被動態生成

    initial_data = [{ 'tool_name':u'first_tool_name '},{ 'tool_name':u'second_tool_name',}]

    表單集= ToolBoxFormSet(extra = 0,initial = initial_data)

不確定驗證部分。這裏我們將tool_name作爲textbox的值。在驗證過程中,Form可能需要ID(因爲它應該是列表框)。但是,你也可以處理。

有關表單集更多信息請參閱:http://docs.djangoproject.com/en/dev/topics/forms/formsets/