【问题标题】:Django, ajax populate form with model dataDjango,ajax用模型数据填充表单
【发布时间】:2014-06-11 20:36:35
【问题描述】:

所以我得到了一个简单的注册表单。在此表单中还有 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?喜欢&lt;li&gt;...&lt;/li&gt;

【问题讨论】:

    标签: jquery python ajax django forms


    【解决方案1】:

    这需要几个步骤才能完成,但它看起来比实际上更令人生畏。

    首先创建一个新视图,它将接收您的 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 执行此任务,但我认为它更容易并且需要更少的数据传输来在视图中处理它。

    【讨论】:

    • 我尝试了好几个小时让它工作,但不幸的是没有结果。我更新了问题并添加了一些代码!你怎么看?
    • 更新答案以帮助您解决新问题
    猜你喜欢
    • 2019-01-29
    • 2010-10-30
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2012-08-14
    • 2020-07-23
    相关资源
    最近更新 更多