【问题标题】:Send data from django views to angularjs controller将数据从 django 视图发送到 angularjs 控制器
【发布时间】:2016-08-11 08:15:50
【问题描述】:

我正在尝试将数据从 django views.py 文件发送到 angularjs controller.js 文件,但无法发送。 问题是我无法将数据从视图文件发送到控制器。当我运行我的代码时,值 {%steps%} 不会更改为我在视图文件中分配的值。 我不想使用 Django 休息框架来做到这一点。 有没有其他方法可以实现这一目标?如果是的话,请帮帮我。

views.py

from django.shortcuts import render
from django.conf import settings
from user_data.models import GetData
import json

def home(req):
    return render(req, 'index.html')

def userData(req):
    if req.method == 'GET':
        user_data = GetData().getAllData()
        context_dict = {'user_data1' : json.dumps(user_data[0]),
                        'user_data2' : json.dumps(user_data[1]),
                        'user_steps' : json.dumps(2000)}

        return render(req, 'index.html', context_dict)

controller.js

'use strict';

MetronicApp.controller('DashboardController', function($rootScope, $scope, $http, $timeout) {
    $scope.$on('$viewContentLoaded', function() {   
        // initialize core components
        Metronic.initAjax();
    });
    $scope.steps = {{user_steps|safe}};
});

html 文件:-

<div ng-controller="DashboardController" class="margin-top-10">
    <div class="row ">
                <div class="col-md-12 col-sm-12">
                    <div class="portlet light ">
                            <div class="portlet-title">
                                <div class="caption">
                                    <i class="icon-cursor font-purple-intense hide"></i>
                                    <span class="caption-subject font-purple-intense bold uppercase">Tracker Report</span>
                                </div>
                                <div class="actions">
                                    <a href="javascript:;" class="btn btn-sm btn-circle btn-default easy-pie-chart-reload">
                                    <i class="fa fa-repeat"></i> Reload </a>
                                </div>
                            </div>
                            <div class="portlet-body">
                                <div class="row">
                                <div class="col-md-3">
                                    <div class="easy-pie-chart">
                                        <div class="number transactions" data-percent="55">
                                            <span>{$ steps $}</span>
                                        </div>
                                        <!-- <a class="title" href="#"> -->
                                        Steps <!-- <i class="icon-arrow-right"></i> -->
                                        </a>
                                    </div>
                                </div>
                                <div class="margin-bottom-10 visible-sm">
                                </div>
                                <div class="col-md-3">
                                    <div class="easy-pie-chart">
                                        <div class="number visits" data-percent="85">
                                            <span>
                                            +85 </span>
                                            %
                                        </div>
                                        <!-- <a class="title" href="#"> -->
                                        Sleep<!-- <i class="icon-arrow-right"></i> -->
                                        </a>
                                    </div>
                                </div>
                                <div class="margin-bottom-10 visible-sm">
                                </div>
                                <div class="col-md-3">
                                    <div class="easy-pie-chart">
                                        <div class="number bounce" data-percent="46">
                                            <span>
                                            +46 </span>
                                            %
                                        </div>
                                        <!-- <a class="title" href="#"> -->
                                        Calories <!-- <i class="icon-arrow-right"></i> -->
                                        </a>
                                    </div>
                                </div>
                                <div class="margin-bottom-10 visible-sm">
                                </div>
                                <div class="col-md-3">
                                    <div class="easy-pie-chart">
                                        <div class="number bounce" data-percent="32">
                                            <span>
                                            +32 </span>
                                            %
                                        </div>
                                        </a>
                                    </div>
                                </div>

                            </div>
                            </div>
                        </div>
                </div>
</div>

【问题讨论】:

  • 您没有向我们提供足够的信息来帮助您。您发布的代码有什么问题?发生什么了?你想要发生什么?你看到了什么错误?
  • @DanielRoseman 问题是我无法将数据从视图文件发送到控制器。当我运行我的代码时,值 {%steps%} 不会更改为我在视图文件中分配的值。
  • 您尝试在 js 文件中使用 django 模板语法,但 django 不呈现 javascript 文件
  • @Sayse 那么我到底能做些什么来将值从 django 后端传递到 angularjs 前端?
  • 看,您要么在 Django 中填充服务器端的静态页面(使用视图呈现模板),要么使用 API 动态获取数据(从客户端,在 AngularJS 级别) . API 可以是 Django Rest Framework,也可以是您自己开发的东西,或者是两者的组合。但数据必须来自某个地方!

标签: python angularjs django


【解决方案1】:

这基本上是我在我的一个主要 django 项目中所做的(但我不能 100% 确定,这是否是您正在寻找的,或者这不是您正在寻找的,作为答案)。 因此,我创建了一个 custom.py 文件,而不是 views.py,在该文件中我制作了自定义 API 并在我的 django 应用程序的 urls.py 中调用它们(使用 urlpatterns)。我还有另一组 API,我正在使用 django rest 框架,为此我制作视图集而不是简单视图。以防万一,您有兴趣,不妨阅读this SO link

但是既然你特别提到你不想使用django rest框架,我就给你一个custom.py文件的例子,如上所述。 您将在下面找到一个在 custom.py 中定义的 API 示例,

@api_view(['GET'])
def get_user_details(request):
    """
    API View that gives a user detail

    ---

    parameters:
        - name: email
          description: The email of the user based on which his/her information has been extracted
          required: true
          type: string

    responseMessages:
        - code: 400
          message: Email required as GET parameters.
          message: User not found.
        - code: 200
          mesage: User details sent successfully

    consumes:
        - application/json
        - application/xml
    produces:
        - application/json
        - application/xml

    """

    email = request.query_params.get('email', None)

    if email is None:
        return HttpResponseBadRequest("Email required as GET parameters.")

    try:
        user = User.objects.get(username=email)
    except User.DoesNotExist:
        return HttpResponseBadRequest("User not found.")
  
    response_data = {'id': user.id, 'first_name': user.first_name, 'last_name': user.last_name,}

    return HttpResponse(json.dumps(response_data), content_type="application/json")

随后,我的 django 应用程序中的 urls.py 看起来像:

urlpatterns = router.urls

urlpatterns = urlpatterns + [
    url(r'get_user_details/', get_user_details),
]

我的控制器看起来像这样:

  CheckEmail : function (current) {
    return $http({
        method: 'GET',
        url: baseAPI + 'admin/get_user_details/',
        params: {email: current},
    })
  },

随后,您可以使用句柄在 html 文件中呈现您希望打印的变量。

希望,它会有所帮助。

【讨论】:

  • 好的,所以我必须为此创建 api?正是我想要做的是使用 python 框架从 dynamodb (amazon web services db) 获取数据并使用 angularjs 显示它
  • 是的,我想创建一个 API 可能会解决您的问题。甚至我的项目也涉及存储在 s3 存储桶中的数据,我们已经使用 django 模型定义了整个数据库模式。我在 custom.py 文件中编写的更多 API 中查询我们的数据库,然后以 JSON 格式发送从每个 API 生成的响应数据(然后以角度处理并将数据呈现在前面结束)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多