所以我得到了一份简单的注册表格。在这种形式中还有3个字段:
我尝试做的是过滤数据。因此,当用户选择大学时,课程字段(选择)将显示属于该大学的所有课程。此外,当用户选择课程时,模块字段(选择)将显示属于该课程的所有模块。如果你检查图像,你会发现它有点简单。
我设法显示了所有大学,课程和模块,但由于数据不正确(显示所有条目),因此不实用。我知道如何过滤查询集,但我不知道如何使用AJAX来做到这一点。试过很多教程,但找不到东西,所以我很抱歉没有发布代码。
如果你能指出我正确的教程,示例或给我一些代码来开始研究它......
更新
我用Del的例子开始研究它。问题是我对AJAX和JS一点也不擅长。所以我创建了一个从ajax表单接收请求的视图(现在它只返回所有课程,没有过滤)。我遇到的问题是,当我选择大学时,course
选择变为空。所以我猜它没有从视图中获取数据。如果你能看看..
视图
def ajax_get_courses(request):
courses = Course.objects.all()
if request.is_ajax():
data = serializers.serialize('json', courses)
return HttpResponse(data,'json')
else:
return render_to_response('registration/registration_form_teacher.html', {'courses':courses}, context=RequestContext(request))
JS
$(document).ready(function(){
$("#university").change(function(){
var request = $.ajax({
url: "{% url 'ajax_get_courses' %}",
type: "POST",
data: { university: $("#university").val(),
csrfmiddlewaretoken: '{{ csrf_token }}'
},
dataType: "html"
});
request.done(function(msg) {
$("#course").html( msg );
});
});
});
更新2
因此,在选择大学之后,选择课程的源代码如下:
<select id="course" name="course" class="form-control">[{"pk": 1, "model": "studies.course", "fields": {"attendance": "FT", "name": "Computer Science", "degree": "BSc (Hons)", "university": 1, "modules": [], "years": 3}}, {"pk": 2, "model": "studies.course", "fields": {"attendance": "FT", "name": "Computer Science", "degree": "MComp (Hons)", "university": 1, "modules": [], "years": 4}}, {"pk": 3, "model": "studies.course", "fields": {"attendance": "FT", "name": "Civil Engineering", "degree": "BEng (Hons)", "university": 1, "modules": [], "years": 3}}, {"pk": 4, "model": "studies.course", "fields": {"attendance": "FT", "name": "Civil Engineering", "degree": "MEng (Hons)", "university": 1, "modules": [], "years": 4}}, {"pk": 5, "model": "studies.course", "fields": {"attendance": "FT", "name": "Pharmacy", "degree": "MPharm (Hons)", "university": 1, "modules": [], "years": 4}}, {"pk": 6, "model": "studies.course", "fields": {"attendance": "FT", "name": "Aeronautical Engineering", "degree": "MEng (Hons)", "university": 4, "modules": [], "years": 4}}, {"pk": 7, "model": "studies.course", "fields": {"attendance": "FT", "name": "Biochemistry", "degree": "BSc (Hons)", "university": 3, "modules": [], "years": 3}}, {"pk": 8, "model": "studies.course", "fields": {"attendance": "FT", "name": "Chemistry", "degree": "BSc (Hons)", "university": 3, "modules": [], "years": 3}}, {"pk": 9, "model": "studies.course", "fields": {"attendance": "FT", "name": "Business Studies", "degree": "BSc (Hons)", "university": 3, "modules": [], "years": 3}}]</select>
这意味着我获取数据但是我必须添加一些HTML?喜欢<li>...</li>
?
答案 0 :(得分:4)
这需要几个步骤来完成,但它看起来比实际上更令人生畏。
首先创建一个新视图,它将接收您的ajax请求并将正确的选择选项作为HTML或JSON返回。
然后在大学选择框更改时使用jQuery ajax function设置ajax请求。
这是一个尝试帮助您入门的简单示例: ...
$("#university").change(function(){
$.ajax({
url: "{% url 'universities:view_name' %}",
type: "POST",
data: { university: $("#university").val(),
csrfmiddlewaretoken: '{{ csrf_token }}'
},
dataType: "html"
});
}
// When the request returns, update the contents of the select with HTML received
// from your processing view
request.done(function(msg) {
$("#university").html( msg );
});
我希望这会有所帮助。祝你好运。
编辑: 在您的更新中,您在视图中创建了一个json,但是请求带有ajax的html。而不是json,只需将html构建为字符串并将其渲染为模板的唯一内容。
您认为这样的事情:
html_string=""
for course in Courses.objects.all():
html_string += '<option value="%s">%s</option>' % (course.pk, course.name)
您可以使用json数据在客户端使用javascript执行此任务,但我认为它更容易,并且需要更少的数据传输才能在视图中处理它。