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--