将 ajax 与 django 表单一起使用时,出现错误“选择一个有效的选择。这不是可用的选择之一。”
Posted
技术标签:
【中文标题】将 ajax 与 django 表单一起使用时,出现错误“选择一个有效的选择。这不是可用的选择之一。”【英文标题】:While using ajax with django form, getting error "Select a valid choice. That is not one of the available choices." 【发布时间】:2015-04-05 01:22:24 【问题描述】:我是 django 的新手。我正在使用简单的 ajax 在 course 选择的基础上动态更新选择字段 semester。但是在提交表单时,我收到错误选择一个有效的选择。 选择的选项不是可用的选项之一。代码如下:
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 action="" method="post">
<table>
form.as_table
</table>
% csrf_token%
<input type="submit" value="Submit">
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$(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('<option selected="' + "selected" + '">' + '' +'</option>');
for(var i = 1; i<=data[1]; i++) //data[1] contains no of sem
$('#id_semester').append('<option value="' + i + '">' + i +'</option>');
,
errors: function(e)
alert(e);
)
)
请帮帮我。
【问题讨论】:
【参考方案1】:问题是ChoiceField
要求选择的选项在其选择集中。
在上面的代码中,semester
的选项是通过 jquery 动态更新的。但是,这些选择不是semester
的选择集(即sem_choices
)的一部分。于是就有了问题。
要解决此问题,请使用request.POST
方法将所选值包含在sem_choices
中。
在views.py中:
form = loginForm(request.POST)
sem = request.POST.get('semester')
form.fields['semester'].choices = [(sem, sem)]
【讨论】:
第一次提交后有效。但是在第二次提交后(例如,当触发另一个错误时,问题再次出现)。知道为什么吗?【参考方案2】:另一个解决方案是覆盖 ChoiceField 的 valid_value() 方法。如果您不担心表单可能返回的可能值,那么就这么简单:
class AjaxChoiceField(forms.ChoiceField):
def valid_value(self, value):
return True
或者,如果需要,您可以添加更多验证。
【讨论】:
以上是关于将 ajax 与 django 表单一起使用时,出现错误“选择一个有效的选择。这不是可用的选择之一。”的主要内容,如果未能解决你的问题,请参考以下文章
将 Django 表单资产(媒体类)与清晰表单一起使用时,页面中不包含 .js 文件
将 jquery 与 django rest api 放在一起