我在办公室偷偷学编程(5)后端往前端传数据

前后端都搭好了框架,现在就要从后面往前面传数据了。

终于要正式开始了,真的很兴奋。

翻看django的官方指南,按照数据模型,视图的逻辑,首先需要构建一个数据模型,由于我是从其他数据库中得到数据,于是看了下另外数据库中的表。

好家伙,一个表里面数十个字段,这样一个个的新建要到哪一天。

然后按下面步骤:

1、在settings.py中的DATABASES段落的“default”后面新增一个段落,用于链接mysq数据库。

4ff63a914d9948b1a6465cda5b6d8dc5.png

注意:标红色的是数据库database的名称。要跟你下面设置的用户名,密码能够访问的数据库保持一致。

2、然后在下面的终端中输入下面这个命令

python manage.py inspectdb --database adot > models.py

注意:1)这里的adot是对应上面花括号外面那个adot的。如果是你自己的名称,你自己要记得修改哦。2)那个是右箭头,右箭头后面有个空格。

3、就能够在当前目录下models.py这个文件了,文件里面已经获得已经关联上的数据表,无差别的全部得到。打开后就是下面这个样子的。

de79fe11dbb04ae798875976f6d322fa.png

下面就是所有的数据库表所对应的model了。按自己的需要保留,其他删除。

注意:如果你要管理这个表,也就是增删改,就把关注我标红色这段话,在下面的class Meta: managed = False 改为managed = True。就行了。

4、操作完成后,把这个models.py放到我们的app目录中,也就是docs中。

注意:如果以前的docs里面有models.py文件,不保留的话就覆盖,需要保留的话,就记得把新models.py里面需要的表粘贴到旧的文件里面哦。

5、回到docs\views.py中修改唯一的这段代码,这是用于提供返回结果的。

由于我们确定的是由后端把数据传递到前端去,那么django下就不用template的功能了,需要有django提供json给前端就行了。然后把这个结果返回去就行了。

from django.http import HttpResponse  ##要添加这个依赖
from django.shortcuts import render


# Create your views here.
from .models import MtrMaster ## 从当前目录导入这个模型

datause = "adot"  ## settings.py中配置的数据源名称


def index(request):   ## 定义视图函数,index与urls.py中路由的名字相同
    masters = MtrMaster.objects.using(datause).all()
    context = {"data": masters}
    return HttpResponse(context)

6、由于提供json给前端需要用这个来返回,而在返回前还需要把代码转换为json格式。

这样完成后的代码如下,运营程序,访问网络地址,就能看到json了。

然后前端设置一个网页,把这个json读出来,利用表格的框架就能够显示出来了。

后记...写到这里,就得好好吐槽下,为啥会中间插一篇数据结构了。

因为django从数据库中查到的是一个object,如果需要得到一个list,就需要单独针对上面那段代码新增.values(),然而这个.values()返回的是一个list的objectset。

改造后的代码如下:

import json
from django.http import HttpResponse
from django.shortcuts import render
from django.core.serializers.json import DjangoJSONEncoder  ##需要用到这个导入转换list为json

# Create your views here.

datause = "adot"  ##settings.py里面设置的数据库名字

from .models import MtrMaster  ##这是我读取的表,在models.py中定义


def index(request):
    masters = MtrMaster.objects.using(datause).all()
    results = masters.values("master_id", "master_name")  ##这里一定要注意不能包含前面数据类型中所说明的json不支持的数据类型。
    print(results)
    context = {"data": list(results)}

    return HttpResponse(json.dumps(context, ensure_ascii=False, cls=DjangoJSONEncoder))

最后把这个用json.dumps以后给到httpresponse就行了。

对了,还有几个注意:

1)由于python没有demical和date的数据类型,因此这两个从mysql中读出来后也需要转换。我这里因为是读取显示,所以就直接转string了。

2)前端拿到json后,需要注意vue的ref的赋值逻辑,并不是直接复制给本身,而是需要复制给.value。当然复制完成以后,页面就能够正常响应结果了。

<think>嗯,用户想要了解如何实现一个思维导图,并且需要一个完整的示例,假设后端已经提供了静态数据。首先,我得确定用户的技术背景,但可能他们有一定的前端基础,因为问题涉及到前后端数据交互。不过用户提到后端已经给了静态数据,所以重点应该放在前端如何呈现思维导图上。 首先,思维导图的实现通常需要用到可视化库,比如D3.js、ECharts或者专门用于思维导图的库,比如jsMind或者MindElixir。考虑到用户可能需要一个简单易懂的示例,选择MindElixir可能更合适,因为它专门为此设计,API相对简单,文档也清晰。 接下来,用户需要静态数据的示例,所以得构造一个符合库要求的数据结构。例如,MindElixir的数据结构通常包含节点、子节点、方向等属性。我需要确保示例数据包含多个层级,以展示思维导图的展开效果。 然后,关于实现步骤,可能需要分几个部分:引入库、准备容器、初始化实例、渲染数据。同时,可能需要添加一些基本的样式来调整外观,比如容器的大小、背景颜色等。此外,考虑到用户可能需要交互功能,比如点击节点展开/折叠,或者编辑内容,但用户的需求可能集中在基础展示上,所以示例可以保持简洁,只渲染静态数据。 另外,用户可能需要了解如何将后端数据前端库结合,所以需要说明如何将静态数据递给思维导图库。例如,使用fetch获取数据,或者直接定义一个JavaScript变量来模拟静态数据。这里因为用户假设后端已经提供数据,所以可以定义一个对象变量来模拟。 最后,测试示例是否可行,确保代码没有错误,并且能够在浏览器中正确显示思维导图的结构。可能需要提醒用户注意引入正确的库版本,以及HTML结构是否正确,比如是否指定了合适的容器ID和样式。 总结步骤:选择合适的库、准备数据、编写HTML结构、初始化库并渲染数据、添加必要样式。同时,给出完整的代码示例,并解释各个部分的作用,确保用户能够理解并自行调整。</think>下面我将通过 HTML + JavaScript 的前端方案,使用开源的 [MindElixir](https://github.com/ssshooter/mind-elixir-core) 库实现一个思维导图示例: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>思维导图示例</title> <!-- 引入库 --> <script src="https://cdn.jsdelivr.net/npm/mind-elixir/dist/mind-elixir.js"></script> <style> #container { width: 100vw; height: 100vh; } </style> </head> <body> <div id="container"></div> <script> // 模拟后端提供的静态数据 const mockData = { nodeData: { id: 'root', topic: '核心主题', root: true, children: [ { topic: '分支主题1', children: [ { topic: '子主题1-1' }, { topic: '子主题1-2', children: [ { topic: '细节1' }, { topic: '细节2' } ] } ] }, { topic: '分支主题2', direction: 'right', // 控制分支方向 children: [ { topic: '子主题2-1' }, { topic: '子主题2-2' } ] } ] } } // 初始化思维导图 const mind = new MindElixir({ el: '#container', direction: MindElixir.LEFT, // 全局方向 data: MindElixir.new('new topic'), // 初始化数据模板 draggable: true, // 允许拖拽 contextMenu: true, // 启用右键菜单 toolBar: true, // 显示工具栏 nodeMenu: true, // 显示节点菜单 keypress: true, // 启用快捷键 }) // 渲染数据 mind.init(mockData) </script> </body> </html> ``` 实现步骤说明: 1. **引入依赖**:使用 CDN 加载 MindElixir 库 2. **准备容器**:需要指定一个固定尺寸的容器元素(示例使用全屏) 3. **数据结构**: - `nodeData` 为根节点 - `topic` 为节点显示内容 - `children` 定义子节点 - `direction` 控制分支方向(可选) 4. **初始化配置**: - `el`:绑定容器选择器 - `direction`:全局分支方向 - 功能开关:拖拽、右键菜单等交互功能 5. **渲染数据**:通过 `init()` 方法加载数据 扩展功能支持: - 节点拖拽调整位置 - 右键菜单添加/删除节点 - 快捷键操作(Tab 新建子节点,Enter 新建兄弟节点) - 支持节点样式自定义 - 可导出为 JSON/图片 实际效果: - 中心显示 "核心主题" - 左侧展开 "分支主题1" 的树形结构 - 右侧展开 "分支主题2" - 所有子节点可点击展开/折叠 建议通过本地服务器运行该代码(直接打开可能受跨域限制),完整效果可参考 MindElixir 官方示例进行调整。如需更复杂功能,可查阅官方文档进行样式自定义和事件监听。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值