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 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
python3 实现对图片进行局部切割的方法
Dec 05 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 Python
Python sep参数使用方法详解
Feb 12 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
Apr 20 Python
Python创建自己的加密货币的示例
Mar 01 Python
Python中可变和不可变对象的深入讲解
Aug 02 Python
python实现手机推送 代码也就10行左右
Apr 12 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版(2)
2006/10/09 PHP
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
js实现文本框中焦点在最后位置
2014/03/04 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
js 颜色选择插件
2017/01/23 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
分享一个常用的Python模拟登陆类
2015/03/29 Python
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
用python实现学生管理系统
2020/07/24 Python
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
Linux文件操作命令都有哪些
2015/02/27 面试题
公务员培训自我鉴定
2013/09/19 职场文书
大学生表扬信范文
2014/01/09 职场文书
开学典礼决心书
2014/03/11 职场文书
2014年会策划方案
2014/05/11 职场文书
硕士研究生就业推荐信
2014/05/18 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js