Добавление поля FormData со значением в виде логического значения false приводит к сбою функции.

Я пытаюсь передать AJAX простую форму на сервер Django, где одно поле — это идентификатор объекта, который нужно обновить, а другое — логическое поле, в которое должен быть обновлен соответствующий объект. В Javascript я инициализирую новый FormData, добавляю значения формы и отправляю их на сервер с помощью вызова Ajax. Однако, когда для поля данных логической формы установлено значение false, запрос Ajax завершается ошибкой, говоря, что поле не было установлено.

Форма

from django import forms
class UpdateHazardForm(forms.Form):
  pk = forms.IntegerField()
  fixed = forms.BooleanField()

соответствующий js-код

var fd = new FormData();
fd.append('pk', pID)
fd.append('fixed', checked)

// Ajax changes to server
$.ajax({
  url: "/update_hazard/",
  type: 'POST',
  data: fd,
  dataType: "json",
  processData: false,
  contentType: false,
  success: function(data) {
    if (data['success']) {
      console.log("success");
    }
    else{
      console.log("not success");
    }
  }
});

Функция просмотра

@require_POST
@user_passes_test(lambda u: u.is_superuser)
def updateHazard(request):
  form = UpdateHazardForm(request.POST)
  if form.is_valid():
    pk = form.cleaned_data['pk']
    fixed = form.cleaned_data['fixed']

    hazard = get_object_or_404(Hazard, pk=pk)
    hazard.hazard_fixed=fixed
    hazard.save()

    return JsonResponse({'success': True})
  logger.debug(form.errors)
  return JsonResponse({'success': False})

При вызове fd.append("fixed", checked) с проверенным == истинным сообщение ajax успешно. При проверке == false происходит сбой с ошибкой <ul class="errorlist"><li>fixed<ul class="errorlist"><li> This field is required.</li></ul></li></ul>

Я подозреваю, что функция FormData.append(name, value) проверяет значение с помощью оператора if, который терпит неудачу, когда значение является логическим значением false. Я попытался изменить «проверенное» значение на строку с помощью toString(), но это не сработало.

Любая помощь приветствуется. Я бы предпочел сохранить поле формы как BooleanField, чтобы сохранить функцию просмотра простой.


person tayden    schedule 10.07.2015    source источник


Ответы (1)


Если вы хотите, чтобы логическое поле принимало false, вам нужно установить required=False.

fixed = forms.BooleanField(required=False)
person Alasdair    schedule 10.07.2015
comment
Это работает. Разве FormData.append(name, false) не добавляет данные? Любая идея, почему происходит сбой? - person tayden; 10.07.2015
comment
В Django BooleanField с required=True допустимо только в том случае, если значение равно True. Я не знаком с FormData, поэтому не знаю, что происходит в JavaScript. Вы можете попробовать добавить ведение журнала, чтобы увидеть, работает ли вызов append так, как вы ожидаете. - person Alasdair; 10.07.2015