让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合并文本文件示例
Feb 07 Python
Python加pyGame实现的简单拼图游戏实例
May 15 Python
python @property的用法及含义全面解析
Feb 01 Python
python3.6.3转化为win-exe文件发布的方法
Oct 31 Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 Python
基于python的ini配置文件操作工具类
Apr 24 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
python datetime中strptime用法详解
Aug 29 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
Python pexpect模块及shell脚本except原理解析
Aug 03 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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
PHP实现的常规正则验证helper公共类完整实例
2017/04/27 PHP
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
javascript动态加载三
2012/08/22 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
python实现跨文件全局变量的方法
2014/07/07 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
初中校园之声广播稿
2014/01/15 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
学生会主席事迹材料
2014/01/28 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
物流专员岗位职责
2014/02/17 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
高中军训的心得体会
2014/09/01 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
社区党员干部承诺书
2015/05/04 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python