我正在尝试创建一个动态依赖下拉列表。我的尝试无法运行,因为在运行服务器时未加载选项。
场景是具有以下字段的模型: 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模型中的字段。我需要在数据列表中提及对象方案吗?或者没有它就可以工作
请帮助我解决这个问题。
答案 0 :(得分:0)
基本上不可能。
当您的scenarios
上下文传递给Django模板时,它将呈现为字符串。 django自动将对象编译为模板。 django Context
和Template
就是这样做的。
这意味着,所有呈现的上下文将在模板中为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);
}
});
}
});