Как получить список значений всех выбранных checkbox? Python+Django

Рейтинг: 1Ответов: 1Опубликовано: 19.02.2023

В шаблоне html имеется список из checkbox.

<form action="" method="POST">
        {% csrf_token %}
        <input type="hidden" name="ans" value="{{func}}">
        <p>
            <label>Выберите замкнутый класс:</label>
            {%for el in zclass%}
                <div class="form-check">

                <input class="form-check-input" type="checkbox" name="class" id="flexRadioDefault1" value="{{el}}">

                <label class="form-check-label" for="flexRadioDefault1">{{el}}</label>

                </div>
            {%endfor%}
        </p>
        <input class="btn btn-outline-primary" type="Submit" name="submit" value="Проверить">
    </form>

Мне нужно получить список со всеми выбранными значениями.

Соответствующий фрагмент из views.py

def close_class(request):
    submitbutton = request.POST.get("submit")
    task = Task.objects.get(type="close_class")
    func = BFrand(3)
    answer = ''
    zclass = ['сохраняющая 0', 'сохраняющая 1', 'самодвойственная', 'монотонная', 'линейная']
    if request.method == 'POST':
        clas = request.POST.get("class")
        func = request.POST.get("ans")
        print(clas)
        func = BFrand(3)
    context = {'task': task, 'submitbutton': submitbutton, 'func': func, 'zclass': zclass, 'answer': answer}
    return render(request, 'main/starttask/close_class.html', context)

Я получаю значения checkbox как обычно через get, но в таком случае мне возвращается только последнее выбранное занчние в списке. Как получить список всех выбранных значений?

Ответы

▲ 0

Мое решение в похожей ситуации выглядит так: Шаблон

<span>Фильтровать по году выполнения:</span>
                    {% for i in year %}
                       <input type="checkbox" name="year_{{ i }}" value={{ i }} checked>{{ i }}
                    {% endfor %}

view

Формируем перечень доступных годов у объектов целевой модели (для передачи в шаблон):

for i in objectslist:
    try:
        year = i.zakrytie_date.year
        if str(year) in year_list:
            pass
        else:
            year_list.append(str(i.zakrytie_date.year))
    except AttributeError:
        pass

Получаем данные get запросом:

# получение списка выбранных годов----------------------------------------
    for i in year_list:
        q = ''.join(['year_', str(i)])
        try:
            year_filter.append(request.GET[q])
        except KeyError:
            pass
# -------------------------------------------------------------------------

Собственно фильтруем queryset по годам (первым условием мы проверяем что фильтрация необходима если список доступных годов не равен тому что прилетело в get):

# фильтрация по году-------------------------------------------------
    if year_filter != year_list:
        filtered_ozp_objects = filtered_ozp_objects.filter(zakrytie_date__year__in=year_filter)
        filtered_by_year = 'По следующим годам ' + ' '.join(year_filter)
    else:
        filtered_by_year = ''

Здесь filtered_by_year просто сообщение о примененной фильтрации