Динамический ChoiceField не может быть проверен в форме - PullRequest
1 голос
/ 16 мая 2019

У меня есть форма, которой дают словарь выбора, она заполняет ее правильно, но при отправке формы она недействительна. При попытке напечатать errors, non_field_errors есть только пробелы. Когда я перенаправлен на форму, теперь поле выбора заполняется одним выбором и токеном csrf из предыдущей отправки.

Я пытался назначать варианты разными способами, например self.fields['calendar'] = forms.ChoiceField(choices=choice_list), напрямую назначать другим способом. self.fields['calendar'].choices = choice_list, пользовательский валидатор, который игнорирует валидацию и встроенную отладку.

Форма модели:

class CalendarSelectionForm(forms.Form):
    calendar = forms.ChoiceField(label="Calendar")

    def __init__(self, calendars=None, *args, **kwargs):
        super(CalendarSelectionForm, self).__init__(*args, **kwargs)
        choice_list = [(calendar_id, calendar_name) for calendar_id, calendar_name in calendars.items()]
        if calendars:
            self.fields['calendar'].choices = choice_list

Вид:

    if request.method == "POST":
        print(request.POST)
        cal_sync_form = CalendarSelectionForm(request.POST)
        print("Non-field errors " + str(cal_sync_form.non_field_errors()))
        print("Reg form errors " + str(cal_sync_form.errors))
        # print("Field val " + str(cal_sync_form.calendar))
        print("Field data " + str(cal_sync_form.data))
        print("Field fields " + str(cal_sync_form.fields) + " Form is " + str(cal_sync_form.is_valid()))
        if cal_sync_form.is_valid():
            data = cal_sync_form.cleaned_data
            print(data)
            return render(request, 'management/gcal_sync_dashboard.html')
        else:
            return render(request, 'management/acct_select.html', {'form': cal_sync_form})

Шаблон формы:

<form class="form-import" action="/manage/gcal/sync/" method="post" id = "">
    {% csrf_token %}
    {{ form.calendar }}
    {{ form.errors }}
    {{ form.non_field_errors }}
    <div class="push clearfix"></div>
    <div class="col-sm-6 no-pad push"><input class="btn btn-brand btn-little button filson push-half" type="submit" value="Select email"><i class="fa fa-plus"></i></input>
  </div>
</form>

Цель состоит в том, чтобы проверить опубликованную форму, текущие распечатки выписок

<QueryDict: {'csrfmiddlewaretoken': ['sJHE8JJAzmeS0nRjaYZg5KdMlevJiInYY0G4YFJeITH1cVjciIdR1Dq1N28loUIL'], 'calendar': ['email@email.io']}>
Non-field errors 
Reg form errors 
Field data {}
Field fields OrderedDict([('calendar', <django.forms.fields.ChoiceField object at 0x117323080>)]) Form is False

1 Ответ

1 голос
/ 16 мая 2019

По вашему мнению, вы вызываете конструктор CalendarSelectionForm с request.POST в качестве первого позиционного аргумента.Это означает, что вы вызываете функцию __init__, а request.POST передается как параметр calendars.

Это можно исправить, создав свою форму с именованными параметрами.Кроме того, вам нужно будет передать в calendars тот же параметр, что и при визуализации формы с помощью запроса GET, так как в противном случае варианты сами по себе не совпадают, и пользователь мог выбрать опцию, которая в этом случае не доступно во время запроса POST.Например:

if request.method == 'POST':
    cal_sync_form = CalendarSelectionForm(<b>calendars=my_calendars, data=request.POST</b>)
    # ...

с my_calendars тем же значением, которое вы передаете при построении формы в случае GET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...