0

我试图让 Django 在我的网页上生成有效的 Ajax 交互。

我在这里遵循了 django-dajaxice 的说明:http ://django-dajaxice.readthedocs.org/en/latest/quickstart.html和这里:http ://django-dajaxice.readthedocs.org/en/latest/installation .html

但是,当我尝试在 Chrome 中运行该 Ajax 代码时,我得到的只是弹出一个对话框,其中包含“未定义”一词

顺便说一句,这就是我从 HTML 页面调用 Ajax 的方式:

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

AJAX!!<br/>
<br/>
<input id="myID" type="text" name="myID" maxlength="255" onclick="Dajaxice.example.sayhello(my_js_callback);"/>
<br/>

那么为什么我会得到这个未定义的对话框呢?我打开了 Chrome 的调试器,在这种情况下它没有显示任何错误。

顺便说一句,当上面的安装说明告诉我修改我的 urls.py 时,这是模棱两可的。我有两个 urls.py;一个用于我的站点,一个用于我的应用程序。我把这些陈述放在网站的 url.py 中。但我不确定这是否正确。有人可以确认或否认吗?

4

3 回答 3

4

在遵循您引用的安装和快速入门参考资料时,我也在努力处理 dajaxice 示例。我的错误类似,但我看到“Dajaxice.example 未定义”。

myproj让我们调用ajax.py 文件所在的主 django 项目和已安装的应用程序myproj/myapp。似乎让它对我有用的两个部分是:

  1. 将 ajax.py 文件包含def sayhello(request)在正确的目录中,并为 sayhello 函数使用相应的正确路径。

    • 将其放在 settings.INSTALLED_APPS 中列出的应用程序之一的目录中
    • 如果您安装的应用名称被列为"myproj",ajax 文件应该是myproj/ajax.py,那么 js 引用应该是: Dajaxice.myproj.sayhello(my_js_callback)
    • 如果您安装的应用名称被列为"myproj.subapp",ajax文件应该是myproj/myapp/ajax.py,js参考应该是:Dajaxice.myproj.myapp.sayhello(my_js_callback) [我用这个]
    • 记得把 放在{% dajaxice_js_import %}模板<head>部分

    注意:在我的示例中,“myapp”可以替换为“example”以匹配 dajaxice 示例代码。

  2. 当我通过代码更新时,正确设置 collectstatic 以生成新的 /static/dajaxice/dajaxice.core.js 文件。

    • 我完全按照您引用的 dajaxice readthedocs 安装链接中列出的说明进行操作。
    • 在 settings.py 文件中添加了 STATIC = '/static/
    • INSTALLED_APPS在 settings.py 文件中添加了“django.contrib.staticfiles”
    • 跑到python manage.py collectstatic将所有文件拉到 /static/ 目录中。这包括生成的文件/static/dajaxice/dajaxice.core.js
    • 检查此文件,您应该看到 sayhello 函数的对象层次结构为:Dajaxice.myproj.sayhelloDajaxice.myproj.myapp.sayhello.

此外,如果您正在尝试来自http://www.dajaxproject.com/multiply/function calculate()的乘法示例,请将ajax.py文件的位置更改为:

<script type="text/javascript" charset="utf-8">
    function calculate(){
        Dajaxice.myproj.myapp.multiply(Dajax.process,{'a':$('#a').val(),'b':$('#b').val()})
    };
</script>

或者

<script type="text/javascript" charset="utf-8">
    function calculate(){
  Dajaxice.myproj.multiply(Dajax.process,{'a':$('#a').val(),'b':$('#b').val()})
    };
</script>

并在该部分中包含适当的 dajax js 文件<head>

   <script src="/static/dajax/jquery.dajax.core.js"></script>

或者

  {% static "/static/dajax/jquery.dajax.core.js" %}
于 2013-05-28T10:14:21.627 回答
1

你正在发送一个POST请求,很可能是CSRF 中间件阻止了它。GET相反,通过修改方法装饰器发送请求:

@dajaxice_register(method='GET')
def sayhello(request):
    return simplejson.dumps({'message':'Hello World'})
于 2013-02-17T09:31:35.227 回答
0

我的错误:我在 chrome(F12) 中使用调试,Dajaxice 可用,但Dajaxice.exampleDajaxice.example.sayHello未定义。

您应该在 settings.py 中安装您的 APP示例

http://django-dajaxice.readthedocs.org/en/latest/quickstart.html

INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'dajaxice',
        'example',
        ...
)  

注意 example/ ajax.py,您不能将代码放入其他文件中。

猫示例/ ajax.py

#!/usr/bin/env python
#coding:utf-8
from django.utils import simplejson
from dajaxice.decorators import dajaxice_register


@dajaxice_register()
def sayhello(request):
    return simplejson.dumps({'message':'Hello World'})
于 2013-11-14T05:22:32.153 回答