2014-10-17 85 views
1

有人能告訴我如何使用Django窗體爲其下拉框選擇CustomWidget/CustomField的複選框組?Django窗體 - 帶下拉框的複選框組

  1. 所有複選框應具有相同的名稱(複選框組)
  2. 每個複選框應該有一個下拉作爲子元素(相同下拉爲所有複選框)
  3. CustomWidget /的CustomField應該接受選項= [] PARAM生成複選框組
  4. 複選框組需要=真驗證

enter image description here

例如:

Ex。案例:文本框將顯示維度,每個維度都應該有一個下拉列表,其中包含聚合函數。

+0

這實在是不清楚。什麼是「複選框組下拉列表」?你的照片中的盒子與選擇有什麼關係? – 2014-10-17 14:08:46

+0

每個複選框字段應包含一個下拉菜單 – 2014-10-17 14:34:47

+1

這些下拉菜單應該做些什麼?一個使用示例將是(沒有雙關語意圖)有用。 – frnhr 2014-10-21 08:00:51

回答

0

在forms.py

class DynamicForm(forms.Form): 

    options = [ 
    ('Textbox1', 'Textbox1'), 
    ('Textbox2', 'Textbox2'), 
    ... 
    ] 

    dynamic_data = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=options) 

    def __init__(self, *args, **kwargs): 
     super(DynamicForm, self).__init__(*args, **kwargs) 

     for i in range(1,len(self.options)+1): 
      self.fields['dd_func_'+str(i)] = forms.ChoiceField(widget=forms.Select, choices= [ 
          ('average', 'average'), 
          ('sum', 'sum')], initial='sum', required=False) 

    def __getitem__(self, name): 
     try: 
      field = self.fields[name] 
     except KeyError: 
      raise KeyError('Key %r not found in Form' % name) 
     return forms.forms.BoundField(self, field, name) 

在views.py

from app.forms import DynamicForm 

def create_form(request): 
    if request.method == 'POST': 
     dynamic_form = DynamicForm(request.POST) 
     ... 
     ... 
    else: 
     dynamic_form = DynamicForm() 
    return render(request, 'form.html', { 
     'dynamic_form': dynamic_form 
     }) 

在模板/ form.html

{% load myfilters %} 
{{ dynamic_form.dynamic_data.errors }} 
{% for checkbox in dynamic_form.dynamic_data|checkboxiterator %} 
    {{ checkbox }} 
    {% with c=forloop.counter|stringformat:"s" %} 
     {% with c='dd_func_'|add:c %} 
      {{ dynamic_form|lookup:c }} 
     {% endwith %} 
    {% endwith %} 
{% endfor %} 

在templatetags/myfilters.py

https://djangosnippets.org/snippets/2159/

@register.filter 
def lookup(f, name): 
    try:   
    return f[name] 
    except KeyError: 
    return None 
0

如果我理解正確,這應該做到這一點。

根據您在視圖中的內容,只需將一些列表放在your_list中作爲上下文。根據列表中有多少項目,它將爲每個項目創建其中一個複選框列表組合。

{% for number in your_list %} 
    <div class="check_box" id="check_box_{{ number }}"> 
     <input id="cb_{{ number }}" name="cb_{{ number }}" type="checkbox"><label for="cb_{{ number }}">textbox {{ number }}</label> 
     <select class="some_class"> 
      <option value="1">Sum</option> 
      <option value="2">Difference</option> 
      <option value="3">Whatever</option> 
     </select> 
    </div> 
{% endfor %} 

輸出將是這樣的: http://jsfiddle.net/3vetooLp/1/

+0

我明確指定使用表單字段 – 2014-10-27 10:04:29

1

我會使用MultiValueFieldMultiWidget

可以使MultiValueField 初始化方法接受你想建立的所有選項,並使用自定義邏輯在MultiWidget渲染所有的複選框,並選擇和壓縮/由用戶輸入的數值解壓縮到一個合適的任何選項表示形式,如字典{checkbox_name:operation}。

+0

你能在這裏粘貼你的代碼嗎? – 2014-10-27 10:05:00

+0

我可以在大約8小時內......所以這是在寬限期之後,對不起。 – dukebody 2014-10-27 10:29:02