我如何将Ajax与Django应用程序集成?

9 浏览
0 Comments

我如何将Ajax与Django应用程序集成?

我对Django和Ajax都比较新,我正在一个需要将它们结合起来的项目中工作。我相信我理解它们背后的原则,但我还没有找到一个很好的解释将它们结合起来的方法。

有人能给我一个快速的解释,告诉我两者相互结合时代码库必须如何改变吗?

例如,我能否仍然使用HttpResponse与Ajax一起使用,还是我的响应必须随着Ajax的使用而改变?如果是这样,您可以提供一个更改请求响应的示例吗?如果有任何不同,则我返回的数据是JSON格式。

admin 更改状态以发布 2023年5月23日
0
0 Comments

除了yuvi的精彩回答之外,我想在Django中增加一个小具体例子来处理这个问题(超出任何将要使用的js)。这个例子使用AjaxableResponseMixin并假设有一个Author模型。

import json
from django.http import HttpResponse
from django.views.generic.edit import CreateView
from myapp.models import Author
class AjaxableResponseMixin(object):
    """
    Mixin to add AJAX support to a form.
    Must be used with an object-based FormView (e.g. CreateView)
    """
    def render_to_json_response(self, context, **response_kwargs):
        data = json.dumps(context)
        response_kwargs['content_type'] = 'application/json'
        return HttpResponse(data, **response_kwargs)
    def form_invalid(self, form):
        response = super(AjaxableResponseMixin, self).form_invalid(form)
        if self.request.is_ajax():
            return self.render_to_json_response(form.errors, status=400)
        else:
            return response
    def form_valid(self, form):
        # We make sure to call the parent's form_valid() method because
        # it might do some processing (in the case of CreateView, it will
        # call form.save() for example).
        response = super(AjaxableResponseMixin, self).form_valid(form)
        if self.request.is_ajax():
            data = {
                'pk': self.object.pk,
            }
            return self.render_to_json_response(data)
        else:
            return response
class AuthorCreate(AjaxableResponseMixin, CreateView):
    model = Author
    fields = ['name']

来源:Django文档,基于类的视图中的表单处理

Django 1.6的链接已不再可用,更新至1.11版本

0
0 Comments

虽然这不完全符合SO精神,但我喜欢这个问题,因为当我刚开始时也有相同的困惑,所以我会给你一个快速指南。显然你不理解它们的原理(不要看作是侮辱,但是如果你理解的话,你就不会问这个问题了)。

Django是一个服务器端的语言。这意味着,当客户端访问一个URL时,你需要在views中编写一个函数来渲染用户看到的页面并返回HTML响应。让我们通过例子来了解一下:

views.py:

def hello(request):
    return HttpResponse('Hello World!')
def home(request):
    return render_to_response('index.html', {'variable': 'world'})

index.html:

Hello {{ variable }}, welcome to my awesome site

urls.py:

url(r'^hello/', 'myapp.views.hello'),
url(r'^home/', 'myapp.views.home'),

这是最简单应用的一个例子。当你访问127.0.0.1:8000/hello时,请求将被发送到hello()函数,而当你访问127.0.0.1:8000/home时,将返回index.html页面,并以所需方式替换所有变量(你现在可能已经知道这些了)。

现在让我们来谈谈AJAX。 AJAX是客户端代码,用于执行异步请求。听起来很复杂,但实际上它只是在后台为您执行请求,然后处理响应。因此,当您对某个URL进行AJAX调用时,您得到的与用户访问该位置时相同的数据。

例如,对127.0.0.1:8000/hello进行AJAX调用将返回与访问相同的内容。只不过这次你将其包含在JavaScript函数中,并且你可以根据需要对其进行处理。让我们看一个简单的用例:

$.ajax({
    url: '127.0.0.1:8000/hello',
    type: 'get', // This is the default though, you don't actually need to always mention it
    success: function(data) {
        alert(data);
    },
    failure: function(data) { 
        alert('Got an error dude');
    }
}); 

总的来说,这是一个一般性的处理过程:

  1. 调用URL 127.0.0.1:8000/hello,就像你打开一个新标签页并自己操作一样。
  2. 如果成功(状态码为200),则执行成功函数,它会显示接收到的数据。
  3. 如果失败,则执行不同的函数。

现在会发生什么?您将获得一个带有“hello world”文本的弹出窗口。如果您对主页进行AJAX调用,也是一样的,您将获得一个弹出窗口,其中显示

Hello world, welcome to my awesome site

换句话说- AJAX调用并没有什么新鲜事。它们只是让用户在不离开页面的情况下获取数据和信息的一种方式,这为您的网站提供了流畅和非常整洁的设计。您应该注意以下几点:

  1. 学习jQuery。我无法强调这一点的重要性。您需要了解它一点,以便知道如何处理接收到的数据。您还需要了解一些基本的JavaScript语法(与Python差不多,您会习惯的)。我强烈推荐 Envato的jQuery视频教程,它们非常棒,可以为您指引正确的方向。
  2. 何时使用JSON?。您将看到许多示例,其中Django views发送的数据为JSON格式。我没有详细说明,因为如何做并不重要(有很多说明),更重要的是什么时候使用。答案是- JSON数据是序列化数据。也就是说,您可以操作的数据。正如我提到的,AJAX调用将获取响应,就像用户自己操作一样。现在假设您不想处理所有HTML,而是想发送数据(如对象列表)。JSON很适合这样做,因为它会将其发送为一个对象(JSON数据类似于Python字典),然后您可以在其上迭代或执行其他操作,无需查找无用的HTML。
  3. 先不要添加它。当您构建Web应用程序并想要实现AJAX时,请为自己做个好事。首先,完全构建不带任何AJAX的整个应用程序。确保一切都正常工作。然后,再开始编写AJAX调用。这是一个有益的过程,可以帮助您学到很多东西。
  4. 使用chrome的开发者工具。由于AJAX调用是在后台完成的,因此有时很难调试它们。您应该使用chrome开发者工具(或类似的工具,如firebug)以及console.log 调试。我不会详细解释,请google并了解。这对您非常有帮助。
  5. CSRF意识。最后,请记住,在Django中进行POST请求需要csrf_token。使用AJAX调用时,您很多时候想要在不刷新页面的情况下发送数据。在遗忘发送csrf_token之前,您可能会遇到一些困难。这是AJAX-Django集成中已知的初学者障碍,但在学会如何使它正常工作之后,就非常简单了。

这就是我能想到的所有内容。这是一个广泛的课题,但是是的,可能没有足够的示例。慢慢地发现其中的内容,并逐渐掌握。

0