2014-10-17 2 views
1

Может ли кто-нибудь сказать мне, как писать CustomWidget/CustomField для группы флажков с раскрывающимися списками в ней с использованием форм Django?Django forms - группа checkbox с выпадающими списками

  1. Все Флажки должны иметь такое же имя (группа Checkbox)
  2. Каждый чекбокс должен иметь раскрывающийся как дочерний элемент (то же самое выпадающее меню для всех флажков)
  3. CustomWidget/CustomField следует принимать параметры = [] парам генерировать CheckBox группу
  4. Checkbox группу с требуемым = True проверки

enter image description here

Пример. Случай. Текстовые поля будут показывать размеры, и каждый размер должен иметь раскрывающийся список со списком совокупных функций.

+0

Это действительно непонятно. Что такое «группа флажков выпадающих списков»? Что делать с изображениями на вашем снимке? –

+0

Каждое поле поля должно содержать одно раскрывающееся меню –

+1

Что должны делать эти выпадающие меню? Пример использования будет полезен (не предназначен для каламбуров). – frnhr

ответ

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

Если я правильно вас понимаю, это должно сделать это.

В зависимости от того, что у вас есть в ваших представлениях, просто поместите список в свой список как контекст. В зависимости от количества элементов в списке, он будет создавать одну из этих комбинаций флажков-списков для каждого из них.

{% 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

Я четко указал, используя поле формы –

1

Я хотел бы использовать MultiValueField и MultiWidget.

Вы можете сделать MultiValueField инициализация метода принимают любые параметры, которые вы хотите построить все варианты и использовать собственную логику в MultiWidget, чтобы сделать все галочки и выбирает и сжимать/разжимать ввод значений пользователя в подходящем представление, как dict {checkbox_name: operation}.

+0

Можете ли вы вставить код ур здесь? –

+0

Я могу, но примерно через 8 часов ... Так вот, после льготного периода, извините. – dukebody

Смежные вопросы