2014-10-20 19 views
0

我有一個django頁面(search_form.html)與表單文本字段/按鈕,觸發一個動作去和搜索數據庫輸入的值。結果顯示在另一個Django頁面(search_results.html)。從search_form.html的表單代碼如下:使用json decorator進行django視圖所需的參數 - 如何?

<form action="/datest/partner_search/" method="get"> 
     <label class="control-label">Partner ID</label> 
     <input type="text" name="partnerQ"> 
     <input type="submit" value="Partner Search"> 
    </form> 

我已經在我的應用程序下面urls.py

url(r'^search_form/$', views.search_form, name='search_form'), 
url(r'^search_results/$', views.search_results, name='search_results'), 

而在views.py我有以下

def partner_search(request): 
    error = False 
    if 'partnerQ' in request.GET: 
     q = request.GET['partnerQ'] 
     if not q: 
      error = True 
     else: 
      my_data = MyTable.objects.filter(dbField__icontains=q) 
      return render(request, 'myapp/search_results.html', {'mydata': my_data, 'query': q}) 
    return render(request, 'myapp/search_form.html', {'error': error}) 

這工作正常,但我的問題來了當我想在結果頁面中包含一個jqplot圖形,但要在圖形上繪製的數據需要基於傳遞給上述views.py方法的partnerQ字符串的數據庫查詢。所以我有一個單獨的方法,目的是在我的views.py中爲jqplot創建JSON數據。因此,在urls.py其他項的樣子:

url(r'^my_plot_json/$', views.my_plot_json, name='my_plot_json'), 

views.py方法(它仍然需要從字符串搜索領域 - 不知道如何捕捉到了這個)看起來像以下。注 - 我知道這是行不通的,因爲我沒有通過q

@render_to_json() 
def my_plot_json(request): 
    mydata = MyTable.objects.values("iDate").filter(dbField__icontains=q).annotate(Count("id")) 
    jsondataset = [[str(z['iDate']), z['id__count']] for z in mydata] 
    return [jsondataset] 

相應的JavaScript代碼片段看起來是這樣的:

function populateGraph() { 
    $.get('/myapp/my_plot_json', function(data) { drawTwelveMonthPlot(data); }); 
} 

所以我在總結問題是這樣_我需要執行一個單獨的數據庫查詢來爲我的jqPlot圖生成JSON數據,但我無法弄清楚如何捕獲在my_plot_json方法的表單字段中輸入的搜索字符串。選項,因爲我看到它可能是:

  1. partner_search方法中傳遞字符串中調用my_plot_json
  2. 有兩個行爲歸因於我的表單域,所以這兩個例程都被觸發?

我不知道這些是否可能,並承認,我是一個python/django新手,所以如果可能的話,將欣賞代碼片段樣式的解決方案。提前謝謝了。

回答

0

想到各種各樣的解決方案,但最簡單的方法就是在partner_search方法本身中生成json,並將其與其他參數一起傳遞給模板。然後,您可以直接使用該數據調用drawTwelveMonthPlot,而不是爲它創建單獨的Ajax請求。

編輯

我實在不明白,你不明白。您有一個函數populateGraph,它只包含一個Ajax調用,並且該Ajax調用的結果被傳遞給drawTwelveMonthPlot。因此,您可以簡單地從該Ajax調用中調用drawTwelveMonthPlot並直接調用它,並從模板中傳遞JSON。

function populateGraph() { 
    var data = '{{ json_data_from_view|safe }}' 
    drawTwelveMonthPlot(data); 
} 

這假設JS是在你的Django模板中;如果不是,則可以將var data...行放入模板中的<script>元素中,其餘部分仍然可以使用。

+0

感謝丹尼爾,但我並不完全確定我是如何直接調用Javascript的。就目前情況而言,HTML只具有drawTwelveMonthPlot中使用的div ID。如果我需要的JSON數據不在上面的URL中(/ myapp/my_plot_json),那麼我不知道如何將數據傳遞給它以進行繪圖。對不起,我是一個痛苦的新手提醒。 – deefex 2014-10-20 20:36:54

+0

再次感謝丹尼爾,這很有用。 – deefex 2014-10-21 07:40:53

相關問題