将Django与Angular js集成

时间:2014-06-09 05:34:49

标签: python django angularjs

这将是一个非常基本的问题如何将Django与angularjs 集成。我使用Django开发了一个Web应用程序。在views.py中,我想用json转储我的数据从数据库,但我没有任何想法,或者你可以说我无法开始这个过程。我对Angularjs有一个非常基本的知识水平。如果你举一些例子,那么它将帮助我开始在Angularjs使用Django。为了更方便,这里是我生成的示例视图..

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获取请求来使用Angularjs http服务实现数据。我可以这样做吗?提到我是angularjs的新手。

2 个答案:

答案 0 :(得分:1)

你可以使用django-angular,但我觉得这个包也是WIP。

您应该考虑使用AJAX而不仅仅是渲染。这取决于问题。

我建议使用普通django或添加tastypie或django-rest-framework。我目前使用普通的django视图。

是的,要将模型数据发送回角度,您应该提供数据的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装饰器作为我的视图,它希望视图返回列表,字典或任何其他简单数据,因此它将automatically 序列化(转换)它为JSON。

有一些方便的东西,比如过滤器和分页的例子,顺便说一句。

答案 1 :(得分:0)