我是Django和Dajax的新手,但是使用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警报,内容为:“出问题了”
不幸的是,我不知道如何准确地调试“出了什么问题”。
最佳答案
dajax / dajaxice的处理方法是:您未在views.py中定义可调用dajaxice的“视图”;您可以在应用目录中创建一个单独的ajax.py文件,并在其中定义函数。这些函数的外观和行为与Django视图函数非常相似-例如,如果从login_required
导入django.contrib.auth.decorators
,它将在您的dajax函数上工作,就像在django视图上使用时一样。
实际上,这是一个ajax.py文件,其中包含我的一个dajax函数,该函数搜索干草堆索引以填充jQuery UI自动完成字段:
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代码中没有parens)。另一件事是:我在dajaxice python函数中设置了默认值
request=None
,因为这使调试更加容易。我不知道您是否可以在单元测试中为dajaxice构造存根请求(我不认为可以),但是由于此特定功能不处理request
,因此可以像这样进行测试:>>> from ost2.portfolio.ajax import query
>>> query(q='yo dogg')
[ ... ]
我建议您在设置ajax.py文件之后尝试执行类似的操作,以便可以独立于JavaScript处理程序和其他方法测试python函数。 Dajax和DajaxIce在许多方面都很出色,但是单元测试能力并不是其中之一。
祝好运。