2013-12-20 70 views
0

我需要三個相關的下拉菜單。當用戶選擇第一個菜單(市場環境)時,我需要ajax將這個選擇發送到我在django中的視圖,這樣我可以查詢SQL以獲取貨幣列表並填充第二個列表。在螢火蟲,我不斷收到以下錯誤:Django中的Ajax帖子的問題

MultiValueDictKeyError at /Tplots/ajax_curr/"'mkt'" 

我也發現我的帖子是空的,所以我認爲有些事情是我的Ajax代碼腳麻我不知道什麼是錯。任何幫助都會很棒。

HTML

<script type="text/javascript"> 
$(document).ready(function get_currency(){ 
$('#id_mkt').on('change', function(e) { 
    e.preventDefault(); 
    $.ajax({ 
     type:"POST", 
     url: "/Tplots/ajax_curr/", 
     datatype: "json", 
     success: function(data) { 
      alert(data); 
     }, 
     error:function(){ 
      alert("failure"); 
     } 
    }) 
}) 
    }) 
</script> 

<div align="center"> 
<h1>Swap Curves</h1> 
<form action="{% url 'Tplots:swapFig' %}" method = "post"> 
{% csrf_token %} 
{{form.mkt}} 
{{form.curr}} 
{{form.horizon}} 
<input type = "submit" value="Go To" /> 
</form> 

view.py

@csrf_exempt 
def ajax_curr(request): 
    if request.is_ajax(): 
     selected_mkt = MktEnv.objects.get(mkt=request.POST['mkt']) 
     #selected_mkt = request.POST.get('mkt','') 
     conn = pyodbc.connect('abcd') 
     cursor = conn.cursor() 
     sql_raw = r''' 
      select currency from market_env_detail 
      where mkt_env_id=%s 
      and idx = 1''' % (selected_mkt) 
     cursor.execute(sql_raw) 
     xx = cursor.fetchall() 
     currencyL = [] 
     for items in xx: 
      x = str(items[0]) 
      currencyL.append(x) 
     curr = list(set(currencyL)) 
    json = simplejson.dumps(curr) 
    print json 
    return HttpResponse(json, mimetype="application/json") 

forms.py

class CurrencyForm(forms.Form): 
    Env_Choices = [('', '-- Choose a Environment --'), ] + [(m.mkt, m.mkt) for m in MktEnv.objects.all()] 
    Curr_Choices = [('', '--Choose a Currency --'),]+[(c.curr, c.curr) for c in CurrencyAjax.objects.all()] 
    Horizon_Choices = [('', '--Choose a Horizon --'),] +[(h.hid, h.hid) for h in HorIdAjax.objects.all()] 
    mkt = forms.ChoiceField(choices=Env_Choices) 
    curr = forms.ChoiceField(choices=Curr_Choices) 
    horizon = forms.ChoiceField(choices=Horizon_Choices) 

編輯:

我想使用這個成功函數將數據放入第二個下拉列表中,但是所有的值都變成空白。不知道爲什麼。

success: function(data) { 
      for(var i =0; i<data.length; i++) { 
       var item=data[i]; 
       $('#curr').append(
        $("<option></option>").val(item.Id).html(item.Name)); 
      } 
     } 
+0

您應該使用'.text(item.Name)'。 Html會覆蓋''。如果應該嘗試[這個庫](http://www.appelsiini.net/projects/chained)(jquery.chained.js),它會幫助你更容易編碼鏈接選擇。 –

回答

1

您未發送POST數據。您錯過了data參數。

var data = $(this).parents('form').serialize(); 

$.ajax({ 
    type:"POST", 
    url: "/Tplots/ajax_curr/", 
    data: data, 
    datatype: "json", 
    success: function(data) { 
     alert(data); 
    }, 
    error:function(){ 
     alert("failure"); 
    } 
}) 
+0

謝謝你做到了! 如果我需要這些數據添加到第二個下拉菜單將代碼僅僅是: 成功:功能(數據){ \t \t \t \t $(「#id_curr」)追加(數據); \t \t \t}, – vdesai

+0

我編輯了我的原始文章,以便更容易閱讀有關將數據添加到第二個菜單的問題。 – vdesai

+0

@vdesai因爲你正在向django發送請求中的csrf_token,也許你可以考慮刪除csrf_exempt裝飾器 –