laconic
Янв. 28, 2020 14:04:35
Осваиваю джангу, переношу свои проекты с фласка. Есть пустая форма без модели, мульти-чекбокс
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
Янв. 28, 2020 14:57:12
вам видимо нужен .field.choices =
initial используется для рендера дефолтных значений пустой формы
laconic
Янв. 28, 2020 15:01:20
initial задает имеющиеся чекбоксы, а choices - какие из них выбраны (у меня задаются оба). Проблема в том, что форма не проходит проверку на валидность при отправке POST.
slav0nic
Янв. 28, 2020 15:23:10
choices - список всех возможных вариантов, по которым и происходит валидация, у вас похоже наоборот, в ошибке про это и говорится.
Если данные из модели, то возможно имеет смысл ModelMultipleChoiceField использовать
laconic
Янв. 28, 2020 16:45:09
Да, вы правы, я запутал, варианты задаются в choices, но они у меня задаются тоже, т.е. при GET запросе отрисовывается все как нужно. Данные без модели.
Приведу также код пост запроса, может в нем есть что поправить
if request.method == ‘POST’:
form = TestForm(request.POST)
if form.is_valid():
print('valid')
slav0nic
Янв. 28, 2020 17:09:36
вы б весь код привели, где вы там задаёте choices только вам известно
у вас в примере TestForm создаётся с пустым choices
laconic
Янв. 28, 2020 18:00:41
Разобрался. Он очищал форму при повторной ее инициализации в методе пост
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)
Тогда форма создается не пустой.
Спасибо за помощь!