让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实现批量转换文件编码(批转换编码示例)
Jan 23 Python
Python中的迭代器与生成器高级用法解析
Jun 28 Python
python实现数据预处理之填充缺失值的示例
Dec 22 Python
图解Python变量与赋值
Apr 03 Python
python 利用栈和队列模拟递归的过程
May 29 Python
python调用c++传递数组的实例
Feb 13 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
python3实现mysql导出excel的方法
Jul 31 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
Python requests用法和django后台处理详解
Mar 19 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
php修改文件上传限制方法汇总
2015/04/07 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
div移动 输入框不能输入的问题
2009/11/19 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
vue.js实现请求数据的方法示例
2017/02/07 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
vue实现购物车小案例
2019/09/27 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
浅谈django model postgres的json字段编码问题
2018/01/05 Python
python贪吃蛇游戏代码
2020/04/18 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
python如何删除文件、目录
2020/06/23 Python
详解python内置模块urllib
2020/09/09 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
红领巾广播站广播稿
2014/02/01 职场文书
个性与发展自我评价
2014/02/11 职场文书
求职信怎么写范文
2014/05/26 职场文书
机电专业求职信
2014/06/14 职场文书
武侯祠导游词
2015/02/04 职场文书
小学少先队活动总结
2015/05/08 职场文书
2015年教研员工作总结
2015/05/26 职场文书
关爱空巢老人感想
2015/08/11 职场文书
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL