Django实现将一个字典传到前端显示出来


Posted in Python onApril 03, 2020

后台代码:

fielddict = {'name':'张三','age':18} return render(request,'test.html',{'field':fielddict})

前端代码:

{% for m,n in field.items %}
   {{ m }}:{{ n }}
{% endfor %}

效果图:

Django实现将一个字典传到前端显示出来

如果在前端想根据键取出值:

{{field.name}} {{field.age}}

补充知识:Django model转字典的几种方法

平常的开发过程中不免遇到需要把model转成字典的需求,尤其是现在流行前后端分离架构,Json格式几乎成了前后端之间数据交换的标准,这种model转dict的需求就更多了,本文介绍几种日常使用的方法以供参考,所有例子均基于Django 2.0环境演示

背景介绍

model内容如下:

class Group(models.Model):
 name = models.CharField(max_length=255, unique=True, verbose_name='组名称')
 
 def __str__(self):
  return self.name
 
class User(models.Model):
 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
 update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
 username = models.EmailField(max_length=255, unique=True, verbose_name='用户名')
 fullname = models.CharField(max_length=64, null=True, verbose_name='中文名')
 is_active = models.BooleanField(default=True, verbose_name='激活状态')
 leader = models.ForeignKey('self', null=True, on_delete=models.CASCADE, verbose_name='上级')
 group = models.ManyToManyField(Group, null=True, verbose_name='所属组')
 
 def __str__(self):
  return self.username

需求很简单就是分别把Group和User表中的数据转换成字典格式返回

方法一:直接构建字典

示例代码:

>>> _t = Group.objects.get(id=1)
>>> 
>>> dict = {
... 'id': _t.id,
... 'name': _t.name
... }
>>> 
>>> print(dict)
{'name': 'GroupA', 'id': 1}

这种方法的好处是方便控制最终返回字典value的格式,例如对于User表,我想返回最终的数据是id、创建时间、中文名、上级中文名、所属组名列表的话可以用下边的代码实现

>>> _t = User.objects.get(id=2)
>>> 
>>> dict = {
... 'id': _t.id,
... 'create_time': _t.create_time.strftime('%Y-%m-%d %H:%M:%S'),
... 'fullname': _t.fullname if _t.fullname else None,
... 'leader': _t.leader.fullname if _t.leader else None,
... 'group': [ i.name for i in _t.group.all() ],
... }
>>> 
>>> print(dict)
{'fullname': '运维咖啡吧', 'group': ['GroupA', 'GroupC', 'GroupE'], 'create_time': '2018-10-12 21:20:19', 'id': 2, 'leader': '公众号'}
>>>

缺点也很明显,就是如果一个model字段很多且不需要转换value格式的时候需要写大量冗余的代码,这种问题怎么解决呢?且看下边的方法介绍

方法二:dict

示例代码:

>>> Group.objects.get(id=1).__dict__
{'id': 1, 'name': 'GroupA', '_state': <django.db.models.base.ModelState object at 0x7f68612daef0>}
>>> 
>>> User.objects.get(id=1).__dict__
{'is_active': True, '_state': <django.db.models.base.ModelState object at 0x7f68612fa0b8>, 'id': 1, 'username': 'ops@163.com', 'leader_id': None, 'fullname': '公众号', 'update_time': datetime.datetime(2018, 10, 12, 17, 49, 35, 504141), 'create_time': datetime.datetime(2018, 10, 12, 16, 9, 7, 813660)}

这种方法优点就是写法简单,容易理解,代码量还少

但会发现多了个没用的_state字段,同时Foreignkey字段名多了_id,也没有ManyToManyField字段的数据,且不能按需显示输出,当我只需要其中几个字段时会有大量冗余数据

方法三:model_to_dict

示例代码:

>>> model_to_dict(Group.objects.get(id=1))
{'name': 'GroupA', 'id': 1}
>>> 
>>> model_to_dict(User.objects.get(id=2))
{'leader': 1, 'is_active': True, 'username': 'ops-coffee@163.com', 'fullname': '运维咖啡吧', 'group': [<Group: GroupA>, <Group: GroupC>, <Group: GroupE>], 'id': 2}

这种方法能满足大部分的需求,且输出也较为合理,同时还有两个参数fields和exclude来配置输出的字段,例如:

>>> model_to_dict(User.objects.get(id=2), fields=['fullname','is_active'])
{'is_active': True, 'fullname': '运维咖啡吧'}
>>> 
>>> model_to_dict(User.objects.get(id=2), exclude=['group','leader','id'])
{'fullname': '运维咖啡吧', 'is_active': True, 'username': 'ops-coffee@163.com'}

但是会跳过有editable=False属性字段的展示,对于有auto_now_add=True和auto_now=True属性的datetime字段会默认添加editable=False隐藏属性,这也是上边两个time相关字段create_time和update_time转换成dict后不显示的原因,官方相关源码如下:

for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
 if not getattr(f, 'editable', False):
  continue

方法四:自定义to_dict

示例代码:

from django.db.models.fields import DateTimeField
from django.db.models.fields.related import ManyToManyField
 
class User(models.Model):
 ...
 
 def to_dict(self, fields=None, exclude=None):
  data = {}
  for f in self._meta.concrete_fields + self._meta.many_to_many:
   value = f.value_from_object(self)
 
   if fields and f.name not in fields:
    continue
 
   if exclude and f.name in exclude:
    continue
 
   if isinstance(f, ManyToManyField):
    value = [ i.id for i in value ] if self.pk else None
 
   if isinstance(f, DateTimeField):
    value = value.strftime('%Y-%m-%d %H:%M:%S') if value else None
 
   data[f.name] = value
 
  return data

执行结果:

>>> User.objects.get(id=2).to_dict()
{'is_active': True, 'update_time': '2018-10-12 21:21:39', 'username': 'ops-coffee@163.com', 'id': 2, 'leader': 1, 'group': [1, 3, 5], 'create_time': '2018-10-12 21:20:19', 'fullname': '运维咖啡吧'}
>>> 
>>> User.objects.get(id=2).to_dict(fields=['fullname','is_active','create_time'])
{'is_active': True, 'fullname': '运维咖啡吧', 'create_time': '2018-10-12 21:20:19'}
>>> 
>>> User.objects.get(id=2).to_dict(exclude=['group','leader','id','create_time'])
{'is_active': True, 'update_time': '2018-10-12 21:21:39', 'username': 'ops-coffee@163.com', 'fullname': '运维咖啡吧'}

拥有model_to_dict一样的便利性,同时也解决了不能输出time时间字段(editable=False)的问题,还能对value按照自己需要的格式输出,一举多得

当然拥有便利性的同时需要自己实现to_dict的代码,增加了复杂度

以上这篇Django实现将一个字典传到前端显示出来就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
python实现线程池的方法
Jun 30 Python
Python简单获取自身外网IP的方法
Sep 18 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
python shell命令行中import多层目录下的模块操作
Mar 09 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
python图片指定区域替换img.paste函数的使用
Apr 09 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 Python
Django 后台带有字典的列表数据与页面js交互实例
Apr 03 #Python
Django import export实现数据库导入导出方式
Apr 03 #Python
Django用户身份验证完成示例代码
Apr 03 #Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 #Python
python 的topk算法实例
Apr 02 #Python
python torch.utils.data.DataLoader使用方法
Apr 02 #Python
Python基于stuck实现scoket文件传输
Apr 02 #Python
You might like
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
input file获得文件根目录简单实现
2013/04/26 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
2014/02/04 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
python实现简易通讯录修改版
2018/03/13 Python
python多任务及返回值的处理方法
2019/01/22 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
python中线程和进程有何区别
2020/06/17 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
高中毕业的自我鉴定
2013/12/09 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
工厂搬迁方案
2014/05/11 职场文书
电影地道战观后感
2015/06/04 职场文书
交通处罚决定书
2015/06/24 职场文书
圣诞晚会主持词
2015/07/01 职场文书