将 Django 视图中的数据作为 JSON 对象传递给 vue 实例

Posted

技术标签:

【中文标题】将 Django 视图中的数据作为 JSON 对象传递给 vue 实例【英文标题】:Passing data from Django views to vue instance as JSON object 【发布时间】:2021-01-19 20:39:33 【问题描述】:

我有以下 Django 视图方法,用于将信息发送到 details.html 中的一些 Vue.js 前端代码。我基本上想知道如何将数据发送到 vue 模板。如何进行 JSON 转储?我想这就是我在这里搞砸的。

def works(request):
    heading_info = Heading.objects.order_by('-name')[:1]
    welcome_info = Welcome.objects.order_by('-title')[:1]
    skills_info = Skill.objects.order_by('position')[:5]
    projects_info = Project.objects.order_by('name')[:10]

    items = []
    items.append('heading_info':heading_info, 'welcome_info':welcome_info, 'path':path, 'path2':path2, 'skills_info':skills_info,'projects_info':projects_info)


    # context = 
    # context["items_json"] = json.dumps(items)


    context = 'heading_info':heading_info, 'welcome_info':welcome_info, 'path':path, 'path2':path2, 'skills_info':skills_info,'projects_info':projects_info
    
    return render(request, 'home/details.html', context)

这是我试图访问这些数据的 html。

  <script type='text/javascript'>
    var data =  projects_info|safe ;
  </script> 

<div id="app">

[[projects_info_vue]]     

% comment % #Passing array as vue data. This gets rendered as QuerySet. How do I access these value in Vue. % endcomment %

<div class="row">
% for project in projects_info %            

% comment % #Here is the array being rednered in Django. This array gets rendered as a QuerySet in Vue. % endcomment %

<div class="col">
project.name
</div>
% endfor %
</div>


</div>

<script>
var app = new Vue(
  delimiters: ["[[", "]]"],
  el: '#app',
  data: 
    projects_info_vue: 'projects_info',
  ,
);
</script>

【问题讨论】:

【参考方案1】:

您绝对正确,在某些时候您需要将 Python 对象转换为 Javascript/Vue 可以理解的文字,是的 JSON 是合适的,因为您的数据比单个值(字符串、数字等)。

要将您的 QuerySet 转换为 json 字符串,一个好的方法是首先使用 values() 将其从 QuerySet 对象转换为简单字典列表,然后将其编码为 json。示例:

import json
j = json.dumps(list(Project.objects.order_by('name')[:10].values('name','id')))

您需要将参数调整为值以包含您感兴趣的字段,或完全省略它们以包含所有字段。

您也可以use a seralizer to directly encode the QuerySet。

我相信,一旦您在模板输出中获得了 JSON,您的其余代码应该无需太多调整即可工作。您可以将 json 直接渲染到组件数据中,或者作为组件属性。

不过,我会注意到,从 Django 以 JSON 格式检索“复杂”数据的典型方法是通过 Django Rest Framework。将您的方法用于简单属性非常好,但是当您开始提取更大的数据集时,您将通过让 Vue 组件发出异步请求来获取数据来实现一些性能提升。不过,这是以增加复杂性为代价的(在 Vue 代码中管理 ajax 请求/响应和状态)。

PS。我知道这不是你的问题,但我想指出,我认为通过 Django 模板上的脚本标签使用 Vue 的一般方法存在缺陷,最明显的是错过了单文件组件 (SFC) 的易用性和便利性、热重载和 webpack 的优化。除非您的项目很小,否则我建议您花一些时间来设置这样的集成;以我的经验,前期的努力是值得的。此外,设置并不难,因为我编写了some articles describing the approach 并构建了cookiecutter to boostrap Vue+Django projects。

很好的黑客攻击!

【讨论】:

很棒的文章!我想我会尝试使用您描述的方法合并 Vue。 我还想知道在 Heroku 上运行它有多棘手?您是否尝试过将其部署在服务器上? @RemoBajwa 我有一个使用 docker-compose 的生产部署,非常接近 pydanny django cookiecutter 建议的 docker 设置。我没有尝试过 Heroku。但是,我认为除了标准的 django 部署之外没有太多额外的工作:在收集静态之前只是一个 yarn/npm 构建。

以上是关于将 Django 视图中的数据作为 JSON 对象传递给 vue 实例的主要内容,如果未能解决你的问题,请参考以下文章

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

Django Rest Framework:将嵌套 json 字段中的数据序列化为普通对象

将带有对象列表的字典作为 django 中的值呈现,但模板不显示值

将 JSON 对象解析为 Django 模板

django:使用 json 对象测试基于 POST 的视图

第九章 Django的视图