使用Dajax调用Django视图

时间:2011-08-09 02:30:43

标签: ajax django xmlhttprequest

我是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警告,上面写着“出问题”

不幸的是,我不知道如何准确地调试“出了什么问题”。

2 个答案:

答案 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输出控制台上的日志...