让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 相关文章推荐
pycharm 使用心得(二)设置字体大小
Jun 05 Python
python实现2048小游戏
Mar 30 Python
简单介绍Python中的RSS处理
Apr 13 Python
以一个投票程序的实例来讲解Python的Django框架使用
Feb 18 Python
python matplotlib画图实例代码分享
Dec 27 Python
python 多线程重启方法
Feb 18 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
基于python实现数组格式参数加密计算
Apr 21 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
基于Python爬取fofa网页端数据过程解析
Jul 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
做个自己站内搜索引擎
2006/10/09 PHP
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
JavaScript 函数调用规则
2009/09/14 Javascript
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
Html5如何唤起百度地图App的方法
2019/01/27 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
人事主管岗位职责范本
2013/12/04 职场文书
工地门卫岗位职责
2013/12/30 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
党支部培养考察意见
2015/06/02 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书