AJAX的好处是利用JavaScript请求服务器并操作DOM,局部加载网页,不用重新刷新页面,提高了访问速率,增强了交互效果。坏处是搜索引擎在看源码的时候看不到。问题是Django如何提供json?
下面以付费软件库作json为示例
1. 定义数据库的表
修改models.py
#models.py
from django.db import models
class PaidSoftware(models.Model):
	wizard_name = models.CharField(max_length=300)
	description = models.CharField(max_length=500)
	official_url = models.URLField()
	attachment_url = models.URLField()
执行migrate生成Django需要的表
$ python manage.py migrate
修改admin.py
#admin.py
from django.contrib import admin
from .models import PaidSoftware
admin.site.register(PaidSoftware)
如何使用admin?
- 确保'django.contrib.admin'在INSTALLED_APPS中,位于项目的settings.py
 - 确保admin.site.urls(from django.contrib import admin) include进url,位于项目的urls.py
 
设定好admin后,在后台添加几条记录
- 软件的名称
 - 软件的描述
 - 软件的官方网址
 - 软件注册最重要的附件包的网址
 
在以上数据库都弄后以好,就是提供url接口了
2. 定义Url接口
需要修改
- views.py
 - urls.py
 
修改views.py
利用JsonResponse返回Json数据, JsonResponse在safe=True的情况下要求data类型为dict
#views.py
from django.http import JsonResponse
from .models import PaidSoftware
def GetPaidSoftware(req):
	paidSoftware = PaidSoftware.objects.order_by('-id')
	software_list = []
	for s in paidSoftware:
		software_list.append({
			"wizard_name": s.wizard_name,
			"description": s.description,
			"official_url": s.official_url,
			"attachment_url": s.attachment_url
		})
	return JsonResponse({'softwares': software_list})
修改urls.py
使URI: "api/paidsoftware/" 指向views.GetPaidSoftware
尝试着访问该URI,应该能够返回数据库中所有的付费软件的信息,以JsonData的形式。
3. 前端操作JSON
在HTML页面中引入Jquery,和JS文件getpaidsoftware.js。
在getpaidsoftware.js中使用AJAX
/*getpaidsoftware.js*/
$.ajax({
	type: "get",
	url: "api/paidsoftware/",
	success: function(data){
		var softwares = data.softwares;
		$(softwares).each(function(index, software){
			var wizard_name = software.wizard_name;
			var description = software.description;
			var official_url = software.official_url;
			var attachment_url = software.attachment_url;
			//具体怎么使用每一款付费软件的注册信息
			console.log(wizard_name);
		});
	},
	error: function(){
		alert('load paid software error!');
	}
});
大功告成了吧。
警告:以上示例代码只是作为参考,并没有运行及测试,因而不能保证无错。
附:
view.py中也可以不使用JsonResponse(),而是使用HttpResponse()
因为:
An HttpResponse subclass that helps to create a JSON-encoded response.
It inherits most behavior from its superclass with a couple differences:
Its default Content-Type header is set to application/json.
The first parameter, data, should be a dict instance.
If the safe parameter is set to False (see below) it can be any JSON-serializable object.
    return HttpResponse({'data': data}, content_type='application/json')
参考[doc]: https://docs.djangoproject.com/en/1.8/ref/request-response/#jsonresponse-objects
--EOF--

