我是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在许多方面都很出色,但是单元测试能力并不是其中之一。

祝好运。

09-19 18:53