Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 28, 2020 14:04:35

laconic
Зарегистрирован: 2020-01-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамические choices и POST запрос

Осваиваю джангу, переношу свои проекты с фласка. Есть пустая форма без модели, мульти-чекбокс

class TestForm(forms.Form):
sk = MultipleChoiceField(widget=forms.CheckboxSelectMultiple)

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

Генерируется динамически во вьюшке
form.fields.initial = sk_tuples
Задача - поменять выборы и отправить форму обратно. Когда отправляю POST, не находит сгенерированные опции выбора:
Select a valid choice. 2 is not one of the available choices

В документации написано “choices is meant for static data that doesn’t change much, if ever”.
А что делать, если очень хочется?

Отредактировано laconic (Янв. 28, 2020 14:32:20)

Офлайн

#2 Янв. 28, 2020 14:57:12

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2250
Репутация: +  40  -
Профиль   Отправить e-mail  

Динамические choices и POST запрос

вам видимо нужен .field.choices =

initial используется для рендера дефолтных значений пустой формы

Офлайн

#3 Янв. 28, 2020 15:01:20

laconic
Зарегистрирован: 2020-01-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамические choices и POST запрос

initial задает имеющиеся чекбоксы, а choices - какие из них выбраны (у меня задаются оба). Проблема в том, что форма не проходит проверку на валидность при отправке POST.

Офлайн

#4 Янв. 28, 2020 15:23:10

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2250
Репутация: +  40  -
Профиль   Отправить e-mail  

Динамические choices и POST запрос

choices - список всех возможных вариантов, по которым и происходит валидация, у вас похоже наоборот, в ошибке про это и говорится.
Если данные из модели, то возможно имеет смысл ModelMultipleChoiceField использовать

Офлайн

#5 Янв. 28, 2020 16:45:09

laconic
Зарегистрирован: 2020-01-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамические choices и POST запрос

Да, вы правы, я запутал, варианты задаются в choices, но они у меня задаются тоже, т.е. при GET запросе отрисовывается все как нужно. Данные без модели.

Приведу также код пост запроса, может в нем есть что поправить

if request.method == ‘POST’:
form = TestForm(request.POST)
if form.is_valid():
print('valid')


Офлайн

#6 Янв. 28, 2020 17:09:36

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2250
Репутация: +  40  -
Профиль   Отправить e-mail  

Динамические choices и POST запрос

вы б весь код привели, где вы там задаёте choices только вам известно
у вас в примере TestForm создаётся с пустым choices

Офлайн

#7 Янв. 28, 2020 18:00:41

laconic
Зарегистрирован: 2020-01-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамические choices и POST запрос

Разобрался. Он очищал форму при повторной ее инициализации в методе пост
if request.method == ‘POST’:
form = TestForm(request.POST)

Вынес choices в параметры инициализации формы
def __init__(self, sk, checked, *args, **kwargs):
super(TestForm, self).__init__(*args, **kwargs)
self.fields.choices = sk
self.fields.initial = checked

И передаю их каждый раз
form = TestForm(sk=sk_tuples, checked=sk_checked, data=request.POST)
Тогда форма создается не пустой.
Спасибо за помощь!

Отредактировано laconic (Янв. 28, 2020 18:00:57)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version