使用带有djangoforms的ajax时,得到错误“选择一个有效的选择。 这不是可用的选择之一。“

我是django的新手。 我正在使用简单的ajax在课程选择的基础上动态更新选择字段学期 。 但在提交表单时我收到错误选择一个有效的选择。 选择的选项不是可用选项之一。 代码如下:

forms.py:

from django import forms from feedback_form.models import course,section_info class loginForm(forms.Form): iquery1 = course.objects.values_list('course_name', flat = True) iquery1_choices = [('', '----------')] + [(id, id) for id in iquery1] sem_choices = [('', '----------')] course_name = forms.ChoiceField(iquery1_choices,required=True, widget=forms.Select()) semester = forms.ChoiceField(sem_choices, required= True, widget=forms.Select()) 

views.py:

 def get_batch(request, c_id): current_course = feedback_form.models.course.objects.get(course_name=c_id) batches = feedback_form.models.batch.objects.all().filter(course_id=current_course) no_of_sem = feedback_form.models.course.objects.values_list('number_of_sem', flat=True).filter(course_id = current_course) no_of_sem = int(no_of_sem[0]) batch_dict = {} for batch in batches: batch_dict[batch.batch_id] = batch.batch_id sem = {} sem[no_of_sem] = no_of_sem data = [batch_dict, no_of_sem] return HttpResponse(json.dumps(data)) 

loginForm.html:

  
{{ form.as_table }}
{% csrf_token%}
$(document).ready(function(){ $('#id_course_name').change(function() { request_url = 'login/get_batch/' + c_id + '/'; $.ajax({ url: request_url, success: function(data){ data = $.parseJSON(data); $('#id_semester').html('' + '' +''); for(var i = 1; i<=data[1]; i++) //data[1] contains no of sem $('#id_semester').append('' + i +''); }, errors: function(e) { alert(e); } }) })

请帮帮我。

问题是choiceField要求选择的选项在其选择集中。 在上面的代码中, semester的选择是通过jquery动态更新的,但这不是学期选择集即sem_choices 。 因此问题就出现了。 要解决此问题,请在sem_choices包含所选值。 通过使用request.POST方法。

在views.py中:

 form = loginForm(request.POST) sem = request.POST.get('semester') form.fields['semester'].choices = [(sem, sem)] 

另一种解决方案是覆盖ChoiceField的valid_value()方法。 如果您不担心表单可能返回的值,那么它就像这样简单:

 class AjaxChoiceField(forms.ChoiceField): def valid_value(self, value): return True 

或者,如果需要,您可以添加更多validation。