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中使用动态变量名的方法
May 06 Python
Python中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
用python写的一个wordpress的采集程序
Feb 27 Python
python去除空格和换行符的实现方法(推荐)
Jan 04 Python
如何利用python查找电脑文件
Apr 27 Python
python @classmethod 的使用场合详解
Aug 23 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
Jan 02 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
windows支持哪个版本的python
Jul 03 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
Python实现简单猜数字游戏
Feb 03 Python
python如何做代码性能分析
Apr 26 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 n个不重复的随机数生成代码
2009/06/23 PHP
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
Django框架安装方法图文详解
2019/11/04 Python
如何基于python操作excel并获取内容
2019/12/24 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
Python定义函数实现累计求和操作
2020/05/03 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
Python与C/C++的相互调用案例
2021/03/04 Python
俄罗斯眼镜网: optikaworld
2016/07/31 全球购物
企业宗旨标语
2014/06/10 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
八年级英语教学计划
2015/01/23 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
Python学习之包与模块详解
2022/03/19 Python