将Django与Angular js集成

2 投票
2 回答
1974 浏览
提问于 2025-04-18 09:05

这个问题非常基础,主要是如何将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格式。

顺便说一下,这里还有一些对你有用的东西,比如过滤器和分页的例子。

撰写回答