django模板:根据等于某个标签值的密钥获取字典的值

时间:2012-03-08 20:27:04

标签: javascript django dictionary

我对网络开发很陌生,我知道这可能是一种愚蠢的方法,但却无法想到更好的方法。在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>

请纠正我的方法,或者如果有人能提供更好的方法。非常感谢。

1 个答案:

答案 0 :(得分:2)

你在这里遇到了麻烦,因为你把服务器端代码(Django的模板引擎)与客户端代码(你用于onchange处理程序的Javascript代码)混淆了。在将生成的HTML传递到客户端之前,您的服务器端代码将在服务器上运行,因此您不能在客户端Javascript和模板逻辑之间进行任何交互。

您可以使用Javascript和onchange事件来更新列出应用的字段中的值 - 您可以在服务器上执行此操作,方法是提交表单并更改返回新请求时使用Django的HTML,但这需要新的网页加载,并不像使用Javascript那样快速或用户友好。

我会通过以下方式来解决这个问题:

  1. 在Django视图类中将字典转换为JSON:

    import json
    ...
    sniffer_app_json = json.dumps(sniffer_apps)
    
  2. 在模板代码中输出JSON作为JavaScript对象:

    var snifferApps = {{ sniffer_apps_json }};
    
  3. 使用JavaScript更新apps字段,使用此数据。 StackOverflow上有many questions addressing this - 您可以考虑使用jQuery,因为它使这种操作更容易。