将 'dict' 对象从 Django 模板传递到 Angular 控制器 - 避免 jsonify 和解析

Posted

技术标签:

【中文标题】将 \'dict\' 对象从 Django 模板传递到 Angular 控制器 - 避免 jsonify 和解析【英文标题】:Passing 'dict' object from Django Template to Angular Controller - avoid jsonify and parsing将 'dict' 对象从 Django 模板传递到 Angular 控制器 - 避免 jsonify 和解析 【发布时间】:2015-12-10 02:38:19 【问题描述】:

我正在尝试从我的 django 模板调用角度控制器函数,并传递我正在迭代的对象,但它要求我在传递之前先将对象转换为 json,然后在控制器中,我已经再次将 json 解析为对象。

这是sn-p:

Django 模板视图:

class Menu(TemplateView):
    template_name = 'menu.html'

    def get_context_data(self, **kwargs):
        context = super(Menu, self).get_context_data(**kwargs)
        # Using the DRF API to fetch the data for template view
        menus = requests.get('http://127.0.0.1:8000/api/v1/menus/').json()
        context['menu'] = menus
        return context

menu.html:

<div class="row" ng-controller="MenuController as vm">
    <ul>
        % for menu_item in menu.menu_items %
            <li class="col-xs-12 col-sm-6 col-md-4">
                <!-- menu_item is dict type object -->
                <button class="btnRed txtUpper" 
                    ng-click="vm.addToCart(' menu_item|to_json|escapejs ')">
                    Add to cart
                </button>
            </li>
         % endfor %
    </ul>
</div>

to_json 是我的自定义过滤器:

@register.filter
def to_json(value):
    return json.dumps(value)

现在,在我的控制器中,要使用传递的对象,我必须再次将 json 解析为对象:

angular.module('menu', [])

.controller('MenuController', ['$log', function($log) 
    this.addToCart = function(menuItem) 
        menuItem = JSON.parse(menuItem);
        $log.debug('Adding MenuItem to Cart: ' + menuItem);
        $log.debug('Adding MenuItem to Cart: ' + menuItem['id']);
    ;
]);

所以,我有很多事情要做。有一次很好,但如果我必须为每个模板和角度集成都这样做,那就太多了。有什么优雅的方法可以避免这种情况吗?

【问题讨论】:

【参考方案1】:

您似乎对 JS 前端和 REST 后端应该如何工作感到很困惑。这里不需要你的 TemplateView。您的 JS 应该直接向 DRF 端点发出请求,该端点将直接返回 JSON。

【讨论】:

是的,可以做到。但出于某种目的,我在这里写 TemplateView。所以,我需要那个。基本上它是一个多页应用程序,而不是传统的单页应用程序。 好吧,我不太明白你的意思,但你当然不应该从你的视图中对 API 进行请求调用。从 Angular 做。 好的,之前我直接从 Angular 使用 DRF。这就是我创建这些 API 的原因。但现在我想要的是为单独的菜单项设置单独的页面,供爬虫跟踪。使用角度单页应用程序,这是不可能的。这就是我们迁移到 TemplateView 的原因。

以上是关于将 'dict' 对象从 Django 模板传递到 Angular 控制器 - 避免 jsonify 和解析的主要内容,如果未能解决你的问题,请参考以下文章

将对象从 Django 传递到 Javascript DOM

将对象从模板传递给 django 视图(控制器)

Django将对象列表传递给模板

Django将对象从视图传递到下一个进行处理

Django,如何将变量从 Django 管理员传递到模板?

无法将参数从模板传递到 Django 视图