是否可以在ajax函数的数据列表中传递Django模型对象?

时间:2018-06-28 09:13:56

标签: jquery html ajax django django-views

我正在尝试创建一个动态依赖下拉列表。我的尝试无法运行,因为在运行服务器时未加载选项。

场景是具有以下字段的模型: scenario_id scenario_name

URL名称​​ Get_Scenario 链接到下面给出的视图函数 get_scenario

我的.html文件

<form action="" method="post">
   {% csrf_token %}

<div class="row">
<div class="col-md-1"></div>
<div class="col-md-5" id="orgdiv">
    <select class="form-control" id="txtOrganization" >
      <option value="" disabled selected>Select Organization</option>
        {% for organization in Organization %}
            <option value="{{ organization.org_id }}">{{ organization.org_name }}</option>
        {% endfor %}
    </select>
</div>

<div class="row">
<div class="col-md-1"></div>
<div class="col-md-5" id="scenariodiv">
   <select id="txtScenario" class="form-control" required>
        <option value="" disabled selected>Select Scenario</option>
    </select>

我的ajax函数

$('#txtOrganization').on("input", function () {
       if (scenarios) {
           $.ajax({
            type: "GET",
            url: {% url 'Get_Scenario' %},
            data: {scenarios: scenarios},
            success: function (data) {
                var udata = "";
                for (var i = 0; i < data.length; i++) {
                    udata = udata + "<option value='"+ scenarios[i].scenario_id + "'>" + scenarios.scenario_name + "</option>"

                }
                $("#txtScenario").append(udata);
            }
        });
        }
    });

views.py

def get_scenario(request):
    org_id = request.GET.get('org_id')
    organization = Organization.objects.get(pk=org_id)
    scenarios = organization.scenario_set.all()
    return scenarios

我觉得问题出在将django模型对象 scenarios 传递给ajax函数数据列表,也许它无法访问Scenario模型中的字段。我需要在数据列表中提及对象方案吗?或者没有它就可以工作

请帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

基本上不可能。

当您的scenarios上下文传递给Django模板时,它将呈现为字符串。 django自动将对象编译为模板。 django ContextTemplate就是这样做的。

这意味着,所有呈现的上下文将在模板中为string,包括您的JavaScript。人们就是这样使用serialize的。

有关serialize的更多信息,请查看下面的文档

如果要使用ajax发送请求,则所有要发送的数据都是string,而不是django对象。

因此,如果要在ajax中传递方案数据,则只需传递方案的ID。

然后在您的视图({% url 'Get_Scenario' %})中,可以从该ID列表中获取对象列表并将其传递给数据。像下面一样

在您看来,只需像scenarios_ids那样传递organization.scenario_set.values_list('id', flat=True)并将其序列化以在JavaScript内部使用。

scenarios_ids_data = json.dumps(list(scenarios_ids))

然后使用模板scenarios_ids_data

$('#txtOrganization').on("input", function () {
       var scenarios_ids = '{{ scenarios_ids_data }}';
       if (scenarios) {
           $.ajax({
            type: "GET",
            url: {% url 'Get_Scenario' %},
            data: {scenarios: scenarios_ids},
            success: function (data) {
                var udata = "";
                // also you will received serialized data and use it here
                }
                $("#txtScenario").append(udata);
            }
        });
        }
    });



                $("#txtScenario").append(udata);
            }
        });
        }
    });