2011-08-09 41 views
3

我對Django和Dajax都很陌生,但我遇到了使用Dajax的非常基本的函數的問題。現在,我只想將表單發佈到Django並返回一個簡單的響應,表明我已到達終端。使用Dajax調用Django視圖

但是,我不斷收到一個錯誤返回到我的表單。

這裏是我的形式:

{% load dajaxice_templatetags %} 

<html> 

    <head> 
     {% dajaxice_js_import %} 


     <script type="text/javascript"> 
      function my_js_callback(data){ 
       alert(data.message); 
      } 
     </script> 
    </head> 

    <body> 
     <form name="new_scan" action="" method="post"> 
      {% csrf_token %}      

      <input type="text" id="scan_sku" name="scan_sku" maxlength="10" /> 
      <button name="sku_lookup_btn" id="sku_lookup_btn" onclick="Dajaxice.inventory.views.test_ajax(my_js_callback);">Add to order</button> 
     </form>  
    </body> 

</html> 

這裏是對應的視圖:

@dajaxice_register 
def test_ajax(request): 
    return "Hello World" 

我得到一個JavaScript警告說, 「出現錯誤」

不幸,我不知道如何調試「出了什麼問題」。

回答

4

與dajax/dajaxice的交易是:您沒有在views.py中定義dajaxice可調用的'views'你在app目錄下創建一個單獨的ajax.py文件,並在那裏定義函數。這些函數看起來很像Django視圖函數 - 例如,如果從django.contrib.auth.decorators導入login_required,它將在您的dajax函數上工作,就像它在django視圖中使用時一樣。

這裏其實是一個包含我的一個dajax功能,其搜索大海撈針指數來填充一個jQuery UI自動完成場的ajax.py文件:

from dajax.core import Dajax 
from dajaxice.core import dajaxice_functions 
from haystack.query import SearchQuerySet 
import ost2.portfolio.models as ax 

def query(request=None, q=''): 
    srcher = SearchQuerySet().models(ax.AXItem) 
    dajax = Dajax() 
    out = [] 
    valid = set() 
    js_callback = "$$('#q')._callback" 

    if q: 
     results = srcher.autocomplete(everything=q.strip()) 
     bestmtch = results.best_match().uuid 
     for result in results.order_by('order'): 
      out.append(dict(
       value=result.title, 
       label=result.object.title, 
       notes=result.object.notes, 
       thumburl=(result.object.keyimage and result.object.keyimage.thumbelina.url or ''), 
       urlstring=result.object.urlstring, 
       pk=result.object.pk, 
       best=bool(bestmtch == result.uuid), 
      )) 

    dajax.add_data({'data': out, 'term': q}, js_callback) 
    return dajax.json() 

dajaxice_functions.register(query) 

......在這種情況下,我沒有使用dajaxice_functions.register()作爲裝飾器 - 我使用早期版本的dajaxice開發了此函數,您必須在其中明確註冊函數。

你應該注意的一件事是:python Dajax類實例有許多方法映射到客戶端上的某些動作(函數調用,DOM操作等);爲了讓這些方法在客戶端正常工作,您將JavaScript函數Dajax.process()設置爲回調(在您的JS代碼中爲sans parens)。

另一件事是:我在dajaxice python函數中設置了默認值request=None,因爲這使得它更容易調試。我不知道你是否能構建單元測試dajaxice存根請求(我不認爲你可以),但由於這種特殊的功能不request處理,也可以這樣進行測試:

>>> from ost2.portfolio.ajax import query 
>>> query(q='yo dogg') 
[ ... ] 

我建議你在設置ajax.py文件後嘗試類似這樣的方法,這樣你就可以獨立於JavaScript處理程序和其他東西來測試python函數了。 Dajax和DajaxIce在很多方面都很出色,但單元測試能力並不是其中之一。

祝你好運。

+1

謝謝跟進這麼多。我將該視圖函數移動到它自己的ajax.py文件中,並將我的js函數指向正確的位置。我也嘗試了從python shell(方便)加載它的調試解決方案,並且工作正常。但是,我仍然得到相同的「出現錯誤」的消息。任何其他的預感?任何方式,我可以驗證電話甚至使它到服務器? –

+0

是的 - 那個'出了點問題'的信息很煩人,它是在我相信的最新版本中引入的。但是 - 是的 - 爲了驗證您是否正在訪問服務器,現在您已經測試了該函數,您可以在ajax.py函數定義的頂部添加打印或日誌記錄功能。如果我沒有記錯,當我的JavaScript回調無效時,我得到'出錯了'的信息;但是因爲你很簡單,所以你可能想確保你的DajaxIce調用是有效的(例如在回調後添加'{}';檢查FireBug中的Dajaxice對象等) – fish2000

1

要看看是怎麼回事,我提議建立日誌工具的dajax:

添加文件處理程序設置。根據測井

'handlers': { 
    'mail_admins': { 
     'level': 'ERROR', 
     'filters': ['require_debug_false'], 
     'class': 'django.utils.log.AdminEmailHandler' 
    }, 
    'logfile': { 
     'level': 'DEBUG', 
     'class': 'logging.FileHandler', 
     'filename': '/path/to/your/log/django.log' 
    }, 

}, 

至於第二步PY的dajaxice記錄添加到記錄器

'loggers': { 
    'dajaxice': { 
     'handlers': ['logfile'], 
     'level': 'DEBUG', 
     'propagate': True, 
    }, 
    'django.request': { 
     'handlers': ['mail_admins'], 
     'level': 'ERROR', 
     'propagate': True, 
    }, 
} 

如果你的控制檯tail -f django.log輸出日誌住在控制檯上工作...

+0

確保你的日誌文件可以被web服務器寫入! – loomi