2017-02-23 60 views
0

Я пытаюсь создать динамическую форму в шаблоне Django.Почему у моей формы Django нет выбора выбора?

У меня есть два выпадающих списка. Когда пользователь выбирает параметр в первом, доступные варианты во втором раскрывающемся списке изменяются динамически. Вот код jQuery, который я использую для изменения выбора во втором раскрывающемся элементе.

$(document).on("change", "[id^=id_form][id$=brand]", function() { 
    var $value = $(this).val(); 

    var $id_prefix = $(this).attr('id').slice(0, -5); 
    $auto_type = $("#" + $id_prefix + "auto_type"); 

    $.ajax({ 
     type: 'GET', 
     url: '/europarts/filter/auto/type/with/brand/' + String($value), 

     success: function(data) { 
      $auto_type.html(data); 
     } 
    }); 
}); 

Вы можете видеть, что он получает некоторые HTML с помощью ссылки, которая в основном куча вариантов, которые заменят текущие. Вот код:

{% for auto_type in auto_types %} 
    <option value="{{ auto_type.id }}">{{ auto_type.name }}</option> 
{% endfor %} 

Вот мои формы:

class ListForm(forms.ModelForm): 

    class Meta: 
     model = List 
     fields = ['ref_no'] 


class ProductCreateForm(forms.Form): 
    brand = forms.ModelChoiceField(queryset=Brand.objects.all(), initial=Brand.objects.first()) 
    auto_type = forms.ModelChoiceField(queryset=AutoType.objects.filter(brand=Brand.objects.first()), empty_label=None) 
    part_no = forms.CharField(max_length=50) 
    description = forms.CharField(max_length=255) 
    quantity = forms.IntegerField() 
    unit = forms.CharField(max_length=20, initial='piece(s)') 
    cost_price = forms.IntegerField(required=False) 
    selling_price = forms.IntegerField(required=False) 

Я использую динамическую библиотеку formset Jquery, чтобы сохранить несколько продуктов с списком.

Это прекрасно работает до сих пор!

Однако после того, как я могу изменить параметры, как это и попытаться представить форму, страницу формы загружается снова с параметрами по умолчанию во втором раскрывающемся списке и не измененные те вместе с ошибкой, которая говорит:

Select a valid choice. That choice is not one of the available choices. 

Вот значение request.POST при отправке формы.

<QueryDict: {'form-MAX_NUM_FORMS': ['1000'], 'form-1-description': ['lskdjf'], 'form-1-auto_type': ['3'], 'form-MIN_NUM_FORMS': ['0'], 'form-0-quantity': ['1'], 'form-0-brand': ['2'], 'form-0-part_no': ['293847'], 'form-0-auto_type': ['2'], 'form-0-unit': ['piece(s)'], 'form-0-description': ['slkdfj'], 'form-1-part_no': ['928374'], 'form-TOTAL_FORMS': ['2'], 'form-1-quantity': ['1'], 'form-INITIAL_FORMS': ['0'], 'ref_no': ['REF230498203948'], 'csrfmiddlewaretoken': ['WYN08Hi2YhwTSKPS8EnLaz94aOz33RVfFMjwYeHr3rMxBImxn7ggSLYHwguIbuL0'], 'form-1-brand': ['2'], 'form-1-unit': ['pieces']}> 

Вы можете увидеть 'form-1-auto_type': ['3'] который был 'form-1-auto_type': ['1'] первоначально. Форма отправляется, когда исходное значение есть, но после динамического изменения значения отображается вышеуказанная ошибка.

Эта ошибка показана для второго выпадающего списка. Как я могу это исправить?

+0

Вы хотите заполнить второй вариант во время выбора или отправки – Cadmus

+0

Не могли бы вы показать код своей формы? – albar

+0

@SnakeFcz On select. Возможно, мой вопрос неясен. Мне удалось динамически изменить параметры второго раскрывающегося списка. Но я не могу представить форму, она показывает ошибку, когда я меняю ее динамически. – MiniGunnR

ответ

1

Когда форма проверяемая он проверяет, существует ли возможность в выборе для поля, в данном случае:

queryset=AutoType.objects.filter(brand=Brand.objects.first()) 

Он работает только тогда, когда вы выбираете опцию из первого бренда. Чтобы сделать его работу, вам необходимо обновить выбор для поля auto_type, прежде чем он проверит данные, или может быть проще не ограничивать выбор auto_type для любой марки, а затем обновлять элемент select в JavaScript, когда страница загружается, чтобы показывать только варианты первого бренда.

+0

Я думаю, что я попробую javascript, чтобы обновить параметры при загрузке. Примите как ответ, если он сработает. Gimme 2 мин. – MiniGunnR

+0

Я использую Django Dynamic Forms для создания нескольких форм. Поэтому я считаю, что использование javascript будет жестким. Как обновить набор запросов с помощью Django? При изменении первого раскрывающегося списка я отправляю запрос на URL-адрес. Могу ли я поместить некоторый код в это представление, чтобы изменить набор запросов в поле формы? – MiniGunnR

+0

Ничего. Я заработал. Я использовал код javascript: '$ (document) .ready (function() { \t \t \t $ (" # id_form-0-auto_type ").html ('<значение опции = "1"> Автомобиль'); \t \t}); 'Спасибо человеку. – MiniGunnR

Смежные вопросы