我是Django的新手,也是Ajax的新手.我正在开展一个项目,我需要整合这两个项目.我相信我理解他们背后的原则,但没有找到两者的良好解释.
有人可以快速解释一下代码库如何随着它们中的两个集成在一起而改变吗?
例如,我是否仍然可以使用HttpResponse
Ajax,或者我的响应是否必须使用Ajax进行更改?如果是这样,请您提供一个示例,说明请求的响应必须如何变化?如果它有任何区别,我返回的数据是JSON.
简单又好看.您无需更改视图.Bjax处理您的所有链接.看看这个: Bjax
用法:
<script src="bjax.min.js" type="text/javascript"></script> <link href="bjax.min.css" rel="stylesheet" type="text/css" />
最后,将此包含在您的html的HEAD中:
$('a').bjax();
有关更多设置,请在此处结帐演示: Bjax Demo
我写这封信是因为可接受的答案很旧,需要复习。
所以这就是我在2019年将Ajax与Django集成的方式:)让我们举一个实际的例子说明何时需要Ajax:-
可以说我有一个带有注册用户名的模型,并借助于Ajax我想知道给定的用户名是否存在。
的HTML:
<p id="response_msg"></p> <form id="username_exists_form" method='GET'> Name: <input type="username" name="username" /> <button type='submit'> Check </button> </form>
阿贾克斯:
$('#username_exists_form').on('submit',function(e){ e.preventDefault(); var username = $(this).find('input').val(); $.get('/exists/', {'username': username}, function(response){ $('#response_msg').text(response.msg); } ); });
urls.py:
from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('admin/', admin.site.urls), path('exists/', views.username_exists, name='exists'), ]
views.py:
def username_exists(request): data = {'msg':''} if request.method == 'GET': username = request.GET.get('username').lower() exists = Usernames.objects.filter(name=username).exists() if exists: data['msg'] = username + ' already exists.' else: data['msg'] = username + ' does not exists.' return JsonResponse(data)
同样,不推荐使用的render_to_response已被render取代,从Django 1.7起,而不是HttpResponse,我们使用JsonResponse进行Ajax响应。因为它带有JSON编码器,所以您不需要在返回响应对象之前对数据进行序列化,但HttpResponse
不建议使用。
虽然这并非完全符合SO的精神,但我喜欢这个问题,因为我在开始时遇到了同样的麻烦,所以我会给你一个快速指南.显然你不理解他们背后的原则(不要把它作为一种冒犯,但如果你这样做,你就不会问).
Django是服务器端.这意味着,比如一个客户端转到url,你在视图中有一个函数可以渲染他看到的内容并在html中返回一个响应.让我们把它分解成例子:
views.py
def hello(request): return HttpResponse('Hello World!') def home(request): return render_to_response('index.html', {'variable': 'world'})
index.html的:
<h1>Hello {{ variable }}, welcome to my awesome site</h1>
urls.py
url(r'^hello/', 'myapp.views.hello'), url(r'^home/', 'myapp.views.home'),
这是最简单的用法的一个例子.去views
意味着对hello函数的请求,127.0.0.1:8000/hello
将返回hello()
并替换所提出的所有变量(你现在可能已经知道了所有这些).
现在让我们谈谈AJAX.AJAX调用是执行异步请求的客户端代码.这听起来很复杂,但它只是意味着它在后台为您提出请求,然后处理响应.因此,当您对某个URL执行AJAX调用时,您将获得与用户前往该位置时相同的数据.
例如,ajax调用127.0.0.1:8000/home
将返回与访问它时相同的内容.只有这一次,你有一个js函数,你可以随意处理它.让我们看一个简单的用例:
$.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');
}
});
一般过程是这样的:
该呼叫转到该URL index.html
,就像您打开一个新选项卡并自己完成一样.
如果成功(状态代码200),请执行成功功能,该功能将提醒收到的数据.
如果失败,请执行其他功能.
现在这会发生什么?你会收到一个警告"hello world".如果你在家里打ajax电话会怎么样?同样的事情,你会得到一个警报说明127.0.0.1:8000/hello
.
换句话说 - AJAX调用并没有什么新内容.它们只是让您在不离开页面的情况下让用户获取数据和信息的一种方式,它使您的网站设计流畅,非常整洁.您应该注意的一些指导原则:
学习jQuery.我不能强调这一点.你必须要了解它以了解如何处理你收到的数据.你还需要了解一些基本的javascript语法(离python不远,你会习惯它).我强烈推荐Envato的jQuery视频教程,它们很棒,会让你走上正确的道路.
什么时候使用JSON?.您将看到很多示例,其中Django视图发送的数据是JSON格式.我没有进入细节上,因为它不是重要的是如何做到这一点(有很多的解释,比比皆是)和很多更重要的时候.答案就是 - JSON数据是序列化数据.也就是说,您可以操纵的数据.就像我提到的,AJAX调用将获取响应,就好像用户自己做了一样.现在说你不想搞乱所有的html,而是想发送数据(也许是一个对象列表).JSON对此有好处,因为它将它作为一个对象发送(JSON数据看起来像一个python字典),然后你可以迭代它或做一些其他的东西,无需筛选无用的html.
最后添加它.当您构建一个Web应用程序并想要实现AJAX时 - 帮自己一个忙.首先,构建完整的应用程序完全没有任何AJAX.看到一切正常.然后,只有这样,才开始编写AJAX调用.这是一个很好的过程,可以帮助你学到很多东西.
使用chrome的开发人员工具.由于AJAX调用是在后台完成的,因此有时很难调试它们.您应该使用chrome开发人员工具(或类似工具,如firebug)和127.0.0.1:8000/hello
要调试的东西.我不会详细解释,只是google并了解它.这对你很有帮助.
CSRF意识.最后,请记住Django中的帖子请求需要<h1>Hello world, welcome to my awesome site</h1>
.使用AJAX调用时,很多时候您希望在不刷新页面的情况下发送数据.在你终于记住之前,你可能会遇到一些麻烦 - 等等,你忘记发送了console.log
.这是AJAX-Django集成中一个众所周知的初学者障碍,但是在你学会了如何使它发挥得很好之后,就像馅饼一样简单.
这就是我头脑中的一切.这是一个广泛的主题,但是,可能没有足够的例子.只要按照自己的方式工作,慢慢地,你最终会得到它.
再说一下yuvi的优秀答案,我想在Django中添加一个关于如何处理这个问题的一个小例子(超出任何将要使用的js).该示例使用AjaxableResponseMixin
并假设作者模型.
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