2011-04-21 93 views
12

我是Django的新手,如果能夠爲我提供一些指導,我將非常感激。我正在嘗試創建一個允許用戶勾選一個或多個選項的表單。我明白我必須使用帶有CheckboxSelectMultiple小部件的MultipleChoiceField字段,但Django文檔沒有提供關於此主題的示例。如果你能給我一個例子並解釋我應該如何處理結果,我將不勝感激。例如,如果我有一個包含選項a b c d的表單,並且用戶選中c和d。另外我如何指定選項(我不想使用數據庫,字符串列表是我的想法)?非常感謝Django表單多項選擇

回答

13

希望這有助於:d

from django import forms 


    class Test(forms.Form): 
     OPTIONS = (
      ("a", "A"), 
      ("b", "B"), 
      ) 
     name = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, 
             choices=OPTIONS) 
+0

怎樣使已經保存/選擇當值Django的顯示編輯表單? – YoYo 2017-01-07 15:55:45

36

forms.py

class SomeForm(forms.Form): 
    CHOICES = (('a','a'), 
       ('b','b'), 
       ('c','c'), 
       ('d','d'),) 
    picked = forms.MultipleChoiceField(choices=CHOICES, widget=forms.CheckboxSelectMultiple()) 

views.py

def some_view(request): 
    if request.method == 'POST': 
     form = SomeForm(request.POST) 
     if form.is_valid(): 
      picked = form.cleaned_data.get('picked') 
      # do something with your results 
    else: 
     form = SomeForm 

    return render_to_response('some_template.html', {'form':form }, 
     context_instance=RequestContext(request)) 

some_template.html

<form method='post'> 
    {{ form.as_p }} 
    <input type='submit' value='submit'> 
</form> 

結果:

checkboxselectmultiple

解釋:

選擇:

在每個元組的第一個元素是要存儲的 實際值。第二個 元素是 選項的人類可讀名稱。

讓選擇框:

form.cleaned_data.get('picked')將導致 '實際價值' 的列表。舉例來說,如果我有print picked取代# do something with your results看到:

在控制檯
[u'a', u'c'] 

+0

非常感謝..它真的爲我清理了一些東西。我還有一個問題。當我嘗試處理結果時,我會嘗試處理列表中的每個元素爲u'a'或只是字符串'a'。 – Bigdinrock 2011-04-21 17:52:58

+0

這是一個非常好的答案!謝謝! – user1451340 2013-04-08 06:25:29

+1

如何獲取人類可讀名稱列表?我需要列出第二個元組的選項。 – 2017-04-24 03:33:47

0

您可以檢查此https://pypi.python.org/pypi/django-multiselectfield/

from multiselectfield import MultiSelectField 

# ... 

MY_CHOICES = (('item_key1', 'Item title 1.1'), 
      ('item_key2', 'Item title 1.2'), 
      ('item_key3', 'Item title 1.3'), 
      ('item_key4', 'Item title 1.4'), 
      ('item_key5', 'Item title 1.5')) 

MY_CHOICES2 = ((1, 'Item title 2.1'), 
      (2, 'Item title 2.2'), 
      (3, 'Item title 2.3'), 
      (4, 'Item title 2.4'), 
      (5, 'Item title 2.5')) 

class MyModel(models.Model): 

    # ..... 

    my_field = MultiSelectField(choices=MY_CHOICES) 
    my_field2 = MultiSelectField(choices=MY_CHOICES2, 
          max_choices=3, 
          max_length=3)