Найти - Пользователи
Полная версия: Динамические choices и POST запрос
Начало » Django » Динамические choices и POST запрос
1
laconic
Осваиваю джангу, переношу свои проекты с фласка. Есть пустая форма без модели, мульти-чекбокс

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”.
А что делать, если очень хочется?
slav0nic
вам видимо нужен .field.choices =

initial используется для рендера дефолтных значений пустой формы
laconic
initial задает имеющиеся чекбоксы, а choices - какие из них выбраны (у меня задаются оба). Проблема в том, что форма не проходит проверку на валидность при отправке POST.
slav0nic
choices - список всех возможных вариантов, по которым и происходит валидация, у вас похоже наоборот, в ошибке про это и говорится.
Если данные из модели, то возможно имеет смысл ModelMultipleChoiceField использовать
laconic
Да, вы правы, я запутал, варианты задаются в choices, но они у меня задаются тоже, т.е. при GET запросе отрисовывается все как нужно. Данные без модели.

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

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


slav0nic
вы б весь код привели, где вы там задаёте choices только вам известно
у вас в примере TestForm создаётся с пустым choices
laconic
Разобрался. Он очищал форму при повторной ее инициализации в методе пост
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)
Тогда форма создается не пустой.
Спасибо за помощь!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB