将Django与Angular js集成
这个问题非常基础,主要是如何将Django和AngularJS结合起来。我用Django开发了一个网页应用。在views.py文件中,我想用json格式把数据库里的数据输出,但我不知道该怎么开始。我的AngularJS知识非常基础。如果你能给我一些例子,那将帮助我用Django入门AngularJS。为了方便理解,这里有一个我写的示例视图……
def userphoto(request):
user_photo = Photo.objects.get(user = request.user)
context = RequestContext(request)
ctx_dict = {'user_photo': user_photo}
return render_to_response('userena/profile_detail.html',ctx_dict,context)
在这里,ctx_dict是直接渲染到一个html文件里的,但我想用AngularJS来渲染这些数据,可能是通过json和http GET请求来实现数据的展示,使用AngularJS的http服务。我该怎么做呢?顺便说一下,我在AngularJS方面还是个新手。
2 个回答
1
你可以使用django-angular,当然可以,不过我觉得这个包还在不断完善中。
你应该考虑用AJAX,而不仅仅是渲染页面。这要看你遇到的问题。
我建议使用普通的django,或者加上tastypie或者django-rest-framework。目前,我是用普通的django视图。
是的,要把模型数据发送回angular,你需要提供数据的JSON格式,你需要序列化你的模型。但是!这里面有很多问题和注意事项。首先,你不需要模型里的所有数据。因为用户可能会接触到一些奇怪的字段。而且你会发送太多在客户端不需要的数据。
所以,你应该把你想要的字段序列化成JSON格式。下面是我怎么做的例子:
@ajax_request
@login_required
def mydata_ajax(request):
qs = MyData.objects.all()
#add possible filters
if request.GET.get('search'):
s = request.GET.get('search')
qs = qs.filter(
Q(name__icontains=s) |
Q(email__icontains=s) |
Q(address__icontains=s) |
)
qs = qs.order_by('task_time', 'name')
#setup pagination so angular will retrieve data page by page
pages = Paginator(qs, 20)
try:
current_page = int(request.GET.get('page', 1))
except ValueError:
current_page = 1
if current_page > pages.num_pages:
current_page = 1
#get reguested page
page = pages.page(current_page)
#create response
return {
'total': pages.count,
'num_pages': pages.num_pages,
'page': current_page,
'data': [{
'id': o.id,
'name': o.name,
'email': o.email,
'address': o.address,
} for o in page.object_list]
}
首先,我使用来自django-annoying包的ajax_request
装饰器,这样我的视图就可以返回列表、字典或其他简单数据,它会自动
把这些数据序列化(转换)成JSON格式。
顺便说一下,这里还有一些对你有用的东西,比如过滤器和分页的例子。