2012-03-08 76 views
0

我對web開發非常陌生,我知道這可能是愚蠢的做法,但無法想到更好的方法。在views.py的方法返回按以下格式命名sniffer_aps到模板的字典:django模板:根據等於某個標籤值的關鍵字獲取字典值

sniffer_aps = {device1:[ap1, ap2], device2:[ap3, ap4, ap5], ......} 

在模板中我有列出了所有設備的下拉列表(DEVICE1,設備2,......) 。

在另一個字段中,我列出了屬於在下拉列表中選擇的設備的所有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

您可能想檢查Jinja2。 – 2012-03-08 20:30:23

回答

2

由於您將服務器端代碼(Django的模板引擎)與客戶端代碼(用於onchange處理程序的Javascript代碼)混淆,因此您在這裏遇到了麻煩。在將生成的HTML發送到客戶端之前,您的服務器端代碼將在服務器上運行,因此您不能在客戶端Javascript和模板邏輯之間進行任何交互。

你說得對使用JavaScript和onchange事件在列出的應用領域,以更新的價值觀 - 你可以這在服務器上,通過提交表單和使用Django改變HTML時,新的請求被返回,但這需要一個新的網頁加載,並不像使用Javascript那樣快速或用戶友好。

  1. 轉換在你的Django視圖類詞典中JSON:

    import json 
    ... 
    sniffer_app_json = json.dumps(sniffer_apps) 
    
  2. Outputing的JSON作爲模板代碼JavaScript對象:

    我會通過處理這

    var snifferApps = {{ sniffer_apps_json }}; 
    
  3. 使用JavaScript更新apps字段,使用thi的數據。在StackOverflow上有manyquestionsaddressingthis - 你可能會考慮使用jQuery,因爲它使得這種操作更容易。

+0

不錯的建議nrabinowitz,聽起來可行,我會嘗試。 – 2012-03-08 20:45:43

+0

還有一件事,在您的建議中,可以在JavaScript中使用django模板變量(如{{sniffer_apps_json}})嗎? – 2012-03-08 20:51:26

+0

當然,只要你確定輸出將是一個有效的JavaScript值。這就是爲什麼我建議首先編碼爲JSON,這應該爲您提供一個格式良好的對象,可用於JavaScript。 – nrabinowitz 2012-03-08 22:01:33

相關問題