让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获取android设备的GPS信息脚本分享
Mar 06 Python
python使用Tkinter显示网络图片的方法
Apr 24 Python
python实现批量监控网站
Sep 09 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
Python3 max()函数基础用法
Feb 19 Python
使用turtle绘制五角星、分形树
Oct 06 Python
Python安装whl文件过程图解
Feb 18 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
Restful_framework视图组件代码实例解析
Nov 17 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
如何在向量化NumPy数组上进行移动窗口
May 18 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一些公用函数的集合
2008/03/27 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
jQuery 学习 几种常用方法
2009/06/11 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
switchery按钮的使用方法
2017/12/18 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
Python中max函数用法实例分析
2015/07/17 Python
python3大文件解压和基本操作
2017/12/15 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
物流专业大学生求职信范文
2013/10/28 职场文书
经理任命书模板
2014/06/06 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书