2011-11-04 2 views
2

У меня есть приложение, в котором у меня есть много экземпляров передачи отдельных выбранных пользователем элементов в поле формы без проблем, но я боюсь делайте то же самое в случае мультиселектора. Кажется, что функция JQuery.val() создает правильный массив данных, но мое поле формы на сервере показывает пустую строку. Я унаследовал это приложение, и я немного об этом подумал.Передайте несколько полей данных из <select multiple> в Django formfield через 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).

Какие-либо намеки, в которых я ошибаюсь? Спасибо.

+0

Какую версию JQuery вы используете? –

ответ

5

I думаю у вас такая же проблема, как я решил. Вам просто нужно изменить параметр в jQuery (новый по состоянию на v1.4 в соответствии с this discussion и указан в jQuery docs), чтобы он не добавлял квадратные скобки к сериализованной переменной, посланной в данных POST.

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

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

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

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

jQuery.ajaxSettings.traditional = true; 

... заставит его отправить данные в

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

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