Django表单 - 带下拉列表的复选框组

时间:2014-10-17 12:19:38

标签: python django django-forms django-templates django-views

有人可以告诉我如何使用Django表单为包含下拉菜单的复选框组编写CustomWidget / CustomField吗?

  1. 所有复选框应具有相同的名称(复选框组)
  2. 每个复选框都应该有一个下拉列表作为子元素(所有复选框的相同下拉列表)
  3. CustomWidget / CustomField应接受options = [] param以生成复选框组
  4. 带有required = True验证的复选框组
  5. enter image description here

    实施例。案例:文本框将显示维度,每个维度都应包含一个下拉列表,其中包含聚合函数列表。

3 个答案:

答案 0 :(得分:1)

我使用MultiValueFieldMultiWidget

您可以使MultiValueField init 方法接受您要构建所有选项的任何选项,并使用MultiWidget中的自定义逻辑来呈现所有复选框,并选择和压缩/解压缩由用户使用合适的表示形式,如dict {checkbox_name:operation}。

答案 1 :(得分: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/

答案 2 :(得分: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
        })

在templates / 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