我是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警告,上面写着“出问题”
不幸的是,我不知道如何准确地调试“出了什么问题”。
答案 0 :(得分:4)
与dajax / dajaxice的交易是:你没有在views.py中定义dajaxice-callable'views';在app目录中创建一个单独的ajax.py文件,然后在其中定义函数。这些函数的外观和行为与Django视图函数非常相似 - 例如,如果从login_required
导入django.contrib.auth.decorators
,它将对您的dajax函数起作用,就像在django视图中使用时一样。
实际上,这是一个包含我的单个dajax函数的ajax.py文件,它搜索一个haystack索引来填充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在很多方面都很出色,但单元测试能力不是其中之一。
祝你好运。答案 1 :(得分:1)
要查看发生了什么,我建议为dajax设置日志记录工具:
在LOGGING
下的settings.py中添加文件处理程序'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'
},
},
第二步,将dajaxice记录器添加到记录器
'loggers': {
'dajaxice': {
'handlers': ['logfile'],
'level': 'DEBUG',
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
如果您正在使用控制台tail -f django.log
输出控制台上的日志...