让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操作日期和时间的方法
Mar 11 Python
pandas带有重复索引操作方法
Jun 08 Python
简单了解python代码优化小技巧
Jul 08 Python
python 实现多线程下载视频的代码
Nov 15 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
tensorflow对图像进行拼接的例子
Feb 05 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 Python
Python基于Twilio及腾讯云实现国际国内短信接口
Jun 18 Python
如何在mac下配置python虚拟环境
Jul 06 Python
python中return不返回值的问题解析
Jul 22 Python
python pip如何手动安装二进制包
Sep 30 Python
使用pycharm运行flask应用程序的详细教程
Jun 07 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函数
2006/10/09 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
基于jQuery的自动完成插件
2011/02/03 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
了解重排与重绘
2019/05/29 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
python实现简单文件读写函数
2021/02/25 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
自荐信格式
2013/12/01 职场文书
小学运动会入场式解说词
2014/02/18 职场文书
银行办公室岗位职责
2014/03/10 职场文书
平安建设工作方案
2014/06/02 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
Nginx源码编译安装过程记录
2021/11/17 Servers
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS
python多线程方法详解
2022/01/18 Python
详解flex:1什么意思
2022/07/23 HTML / CSS