我对网络开发很陌生,我知道这可能是一种愚蠢的方法,但却无法想到更好的方法。在views.py中,方法以下列格式将名为sniffer_aps
的字典返回给模板:
sniffer_aps = {device1:[ap1, ap2], device2:[ap3, ap4, ap5], ......}
在模板中,我有一个下拉列表,列出了所有设备(device1,device2,......)。
在另一个字段中,我列出了属于下拉列表中所选设备的所有aps。我想根据我选择的设备动态调整字段,但它确实不起作用。
下拉列表代码为:
<select onchange="refresh(this.value)" id="sniffer_list">
{% for sniffer_ap in sniffer_aps %}
<option value={{ sniffer_ap }}>{{ sniffer_ap.plug_ip }}</option>
{% endfor %}
</select>
我的问题是,如何根据下拉列表中选择的选项循环显示aps字段中的值?
现在我的方法是使用javascript来检测下拉列表中的“onchange”事件,并相应地更改列出所有aps的字段的值,然后只获取字段的值并将其视为关键字词典。
function refresh(key) {
$('.router').attr('value') = key;
}
对于列出aps的字段,问题出在哪里。我正在努力实现这样的目标:
<select multiple="multiple" size="6">
{% for router in sniffer_aps[this.value] %}
<option class="router" value="">{{ router }}</option>
{% endfor %}
</select>
请纠正我的方法,或者如果有人能提供更好的方法。非常感谢。
答案 0 :(得分:2)
你在这里遇到了麻烦,因为你把服务器端代码(Django的模板引擎)与客户端代码(你用于onchange
处理程序的Javascript代码)混淆了。在将生成的HTML传递到客户端之前,您的服务器端代码将在服务器上运行,因此您不能在客户端Javascript和模板逻辑之间进行任何交互。
您可以使用Javascript和onchange
事件来更新列出应用的字段中的值 - 您可以在服务器上执行此操作,方法是提交表单并更改返回新请求时使用Django的HTML,但这需要新的网页加载,并不像使用Javascript那样快速或用户友好。
我会通过以下方式来解决这个问题:
在Django视图类中将字典转换为JSON:
import json
...
sniffer_app_json = json.dumps(sniffer_apps)
在模板代码中输出JSON作为JavaScript对象:
var snifferApps = {{ sniffer_apps_json }};
使用JavaScript更新apps字段,使用此数据。 StackOverflow上有many questions addressing this - 您可以考虑使用jQuery,因为它使这种操作更容易。