让Django的BooleanField支持字符串形式的输入方式


Posted in Python onMay 20, 2020

再Django中,你可以把字符串形式的数值赋值给IntegerField,然后Django会默认把字符串转换成int。

但是BooleanField则不行,BooleanField只能接受True和False,或者0和1(BTW:在python中True即是1,False即是0)。

这对于很多网络参数上传的场景很不利,因为很多时候我们处于方便会将布尔型参数转换成字符串形式来上传。

一个典型的场景是在使用Swfit的Alamofire框架中的upload来上传Multipartform时,由于form参数只能添加Data形式的参数,直接将Bool型转化成Data会非常麻烦,带来编码类型的问题。

例如采用如下的方式进行转化:

let dataToUpload = Data(bytes: boolVal, count: MemoryLayout<Bool>.size)

以这种形式上传最后被django接收到时,这个字段的值会是"\x00"(False)或者"\x01"(True),导致编码类型的错误。

所以一个较为方便的方法是将bool型变量转化成字符串再上传。

let toText = boolVal ? "1" : "0"
form.append(toText.data(using: String.Encoding.utf8, allowLossyConversion: false)!, withName: key)

不过,这样虽然避免了编码问题,但是在后台赋值时直接将这个字段赋给相应的BooleanField的话,会永远是True(这是当然的,将字符串直接用bool()做强制类型转换就会始终是True)。

一个妥协的办法是现将得到的上传的字符型字段转换成Int,再赋值给BooleanField。

不过,这里要给大家介绍一种更加整洁,更加一劳永逸的办法,就是我们来重定义BooleanField的行为,在为其复制时,自动将字符串以我们想要的规则转换成Bool值。

代码如下:

from django.db.models import BooleanField as _BooleanField

class BooleanField(_BooleanField):  
  def get_prep_value(self, value):    
    if value in ("0", "false", "False"):      
      return False    
    elif value in ("1", "true", "True"):      
      return True    
    else:      
      return super(BooleanField, self).get_prep_value(value)

其中get_prep_value这个函数会在Django准备把字段的值写入数据库时调用。

补充知识:Dajango xadmin 设置只读字段,设置BooleanField类型在页面中的显示位置

class MachineInfoAdmin(admin.ModelAdmin):

def get_readonly_fields(self, request, obj=None):
    """ 重新定义此函数,限制普通用户所能修改的字段 """
    if request.user.is_superuser:
      self.readonly_fields = []
    return self.readonly_fields

  readonly_fields = ('machine_ip', 'status', 'user', 'machine_model', 'cache',
            'cpu', 'hard_disk', 'machine_os', 'idc', 'machine_group')

二,xadmin自定义字段设置排序

def identity(self,ext):
    return ext.user.get_types_display()
  identity.short_description='身份'
  # identity.admin_order_field = 'end_date'

# 设置列表显示字段
list_display = ['name', 'course_org', 'detail','degree','learn_times','students','fav_nums','image','click_nums','add_time']

# 设置列表查询字段
search_field = ['name', 'course_org', 'detail','degree','learn_times','students','fav_nums','image','click_nums']

# 设置列表过滤字段
list_filter = ['name', 'course_org', 'detail','degree','learn_times','students','fav_nums','image','click_nums','add_time']

# 设置显示图标
model_icon = 'fa fa-check-square' # 设置字段可以直接在列表页修改 list_editable=['desc','degree']

# 设置默认排序
ordering=['-click_nums']

# 设置详情页面只读显示
readonly_fields=['fav_nums','click_nums']

# 设置详情页面不显示某个字段
exclude=['add_time']

#自动刷新列表页面(秒数)
refresh_times = [3,5]

三,设置BooleadnField 显示和其他字段同列

1、

让Django的BooleanField支持字符串形式的输入方式

2、

让Django的BooleanField支持字符串形式的输入方式

以上这篇让Django的BooleanField支持字符串形式的输入方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用Python和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
在Linux下调试Python代码的各种方法
Apr 17 Python
举例讲解Python中的算数运算符的用法
May 13 Python
python中循环语句while用法实例
May 16 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
Python SSL证书验证问题解决方案
Jan 13 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
python实现学生信息管理系统源码
Feb 22 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 #Python
基于Python脚本实现邮件报警功能
May 20 #Python
完美解决Django2.0中models下的ForeignKey()问题
May 19 #Python
Django 解决model 反向引用中的related_name问题
May 19 #Python
django queryset 去重 .distinct()说明
May 19 #Python
django正续或者倒序查库实例
May 19 #Python
Django model.py表单设置默认值允许为空的操作
May 19 #Python
You might like
单位速度在实战中的运用
2020/03/04 星际争霸
PHP中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
关于PHP语言构造器介绍
2013/07/08 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
Vue-Router实现组件间跳转的三种方法
2017/11/07 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
英国电器零售商:PRC Direct
2018/06/21 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
应届毕业生求职信
2013/11/30 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
社区禁毒工作方案
2014/06/02 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
Redis如何实现分布式锁
2021/08/23 Redis
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers