Передайте несколько полей данных из <выберите несколько> в поле формы Django через JQuery .val () - PullRequest
2 голосов
/ 04 ноября 2011

У меня есть приложение, в котором у меня есть много случаев передачи отдельных выбранных html выбранных пользователей в поле формы без проблем, но я пытаюсь сделать то же самое в случае множественного выбора. Кажется, что функция JQuery.val() создает правильный массив данных, но мое поле формы на сервере показывает пустую строку. Я унаследовал это приложение и в некотором смысле я нуб.

Соответствующая функция JavaScript

$('.exemptionfield').change(function() {
    var exemptionfield = $(this)

    $.ajax({
        url: '/form/ASubstanceExemption',
        type: 'POST',
        data: {
            sclId: $('#sclId').val(),
            substance: exemptionfield.attr('id'),
            exemption: exemptionfield.val()
        }
    })
})

Форма выглядит как

class ASubstanceExemption(forms.Form):
   buttonTitle = 'submit'
   title = 'not used'

   sclId = forms.IntegerField()
   substance = forms.CharField()
   exemption = forms.MultipleChoiceField(required=False,
                            choices=kExemptions)
   def handle(self, *args, **kwargs):
      sclId = self.cleaned_data['sclId']
      substance = self.cleaned_data['substance']
      exemption = self.cleaned_data['exemption']
      print exemption
etc...

Выбор HTML выглядит как

<select multiple size="5" class="exemptionfield" id="Lead/lead compounds">
<option value="1(a)">
    1(a)
</option>
<option value="1(b)">
    1(b)
</option>
<option value="1(c)">
    1(c)
</option>
<option value="1(d)">
    1(d)
</option>
etc....

В тех случаях, когда у меня есть один выпадающий список html и один выбор form.ChoiceField, выбранное значение (типа exemptionfield) будет передано в переменную освобождения в моей форме. Там никогда не было проблем. Если я переключаюсь на form.MultipleChoiceField и выбираю одну переменную для передачи, как, например, в exemptionfield.val()[0], это также работает нормально. Это будет проходить в формате (пример) [u'1(b)']. Но в тот момент, когда я удаляю [0] и использую только exemptionfield.val(), мне кажется, что я получаю только пустой массив в своей форме. Мое действие печати только показывает [] в результате. Но, глядя на значения, отправленные JavaScript с помощью функции оповещения, он говорит мне, что отправляет 1(b), 1(c), 1(d).

Любые намеки, где я иду не так? Спасибо.

1 Ответ

5 голосов
/ 06 декабря 2011

Я думаю у вас та же проблема, которую я только что решил. Вам просто нужно изменить настройку в jQuery (новая, начиная с версии 1.4, согласно этого обсуждения и на которую есть ссылка в jQuery docs ), чтобы она не добавляла квадрат скобки для сериализованной переменной, отправленной в данных POST.

Когда я отправил my-form-field = $('#my-multi-select').val() с .post(), он отправлял его как:

my-form-field[] = 4
my-form-field[] = 7

Попытка сослаться на это как form.cleaned_data ['my-form-field []'] вместо form.cleaned_data ['my-form-field'] не сработала, Django ищет только имя поля формы без скобки.

В любом случае, добавив эту строку:

jQuery.ajaxSettings.traditional = true;

... заставит отправлять данные как

my-form-field = 4
my-form-field = 7

Из того, что я собрал в обсуждении, связанном выше, поведение по умолчанию лучше работает в PHP и Rails, но вызывает эту проблему с Django. Может, Джанго должен адаптироваться?

...