如何让简单的Hello World Dajaxice交互工作?

时间:2013-02-17 07:51:49

标签: django dajaxice dajax

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

我已按照django-dajaxice的说明进行操作:http://django-dajaxice.readthedocs.org/en/latest/quickstart.html此处:http://django-dajaxice.readthedocs.org/en/latest/installation.html

但是,当我尝试在Chrome中运行该Ajax代码时,我得到的是一个弹出一个对话框,其中包含" undefined"在其中

BTW,这就是我从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中。但我不确定这是否正确。有人可以确认或否认吗?

3 个答案:

答案 0 :(得分:4)

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

让我们调用主django项目myproj和安装的应用程序,其中ajax.py文件位于myproj/myapp。似乎让它适合我的两个部分是:

  1. 将包含def sayhello(request)的ajax.py文件放在正确的目录中,并为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 /
    • 在settings.py文件中将{django.contrib.staticfiles'添加到INSTALLED_APPS
    • 运行python manage.py collectstatic将所有文件拉入/ static /目录。这包括生成的文件/static/dajaxice/dajaxice.core.js
    • 检查此文件时,您应该看到sayhello函数的对象层次结构为:Dajaxice.myproj.sayhelloDajaxice.myproj.myapp.sayhello
  3. 此外,如果您正在尝试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>
    

    并在<head>部分中包含相应的dajax js文件:

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

      {% static "/static/dajax/jquery.dajax.core.js" %}
    

答案 1 :(得分:1)

您正在发送POST个请求,而CSRF middleware很可能会阻止该请求。相反,通过修改方法装饰器发送GET请求:

@dajaxice_register(method='GET')
def sayhello(request):
    return simplejson.dumps({'message':'Hello World'})

答案 2 :(得分:0)

我的错误:我在chrome(F12)中使用调试,Dajaxice可用,但是 Dajaxice.example Dajaxice.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',
        ...
)  

备注示例/ ajax.py ,您无法将代码放入其他文件中。

cat example / 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'})