【问题标题】:How to get simple, Hello World Dajaxice interaction to work?如何让简单的 Hello World Dajaxice 交互工作?
【发布时间】:2013-02-01 20:47:19
【问题描述】:

我正在尝试让 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 中。但我不确定这是否正确。有人可以确认或否认吗?

【问题讨论】:

  • 你从 django 端返回什么?
  • Burhan,我如何检查从 Django 端返回的内容? Django 中应该调用的函数如下所示:@dajaxice_register def sayhello(request): return simplejson.dumps({'message':'Hello World'})
  • 你是如何使用 runserver 运行代码的?你有 debug=True 吗?
  • 在我的 settings.py 中,DEBUG = True。这就是我运行 Django 服务器的方式: python ~myUser/project_base/web_container/manage.py runserver 0.0.0.0:80 仅供参考,当上面的 onclick 方法触发时,我看到 Django 网络服务器出现以下行:“POST /dajaxice /myApp.sayhello/HTTP/1.1"

标签: django dajaxice dajax


【解决方案1】:

在遵循您引用的安装和快速入门参考资料时,我也在努力处理 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 %}放在模板&lt;head&gt;部分

    注意:在我的示例中,“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

此外,如果您正在尝试来自 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>

并在&lt;head&gt; 部分中包含适当的 dajax js 文件:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 当我按照您的建议将其更改为 GET 请求时,它仍然无法正常工作。一样的症状。但是,这一次当 onclick 事件触发时,我看到来自服务器窗口:[17/Feb/2013 13:12:18] "GET /dajaxice/myApp.sayhello/?argv=undefined HTTP/1.1" 200 10567 此外, 我在 sayhello() 里面放了一个打印语句。如果它到达那里,它应该将该行打印到服务器的控制台上。但它没有。所以它没有进入 sayhello() 函数。
    【解决方案3】:

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

    你应该在你的settings.py中安装你的APPexample

    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',
            ...
    )  
    

    note example/ajax.py,不能将代码放到其他文件中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      相关资源
      最近更新 更多