让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写的windows服务不能启动的问题
Apr 15 Python
分享Python字符串关键点
Dec 13 Python
Python数据结构之栈、队列的实现代码分享
Dec 04 Python
python模块之paramiko实例代码
Jan 31 Python
实例讲解python中的协程
Oct 08 Python
Python魔法方法详解
Feb 13 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
Django日志及中间件模块应用案例
Sep 10 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
python爬虫如何解决图片验证码
Feb 14 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 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利用单例模式实现日志处理类库
2014/02/10 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
解决IE6的PNG透明JS插件使用介绍
2013/04/17 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
python 有效的括号的实现代码示例
2019/11/11 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
python 写一个文件分发小程序
2020/12/05 Python
Python 图片处理库exifread详解
2021/02/25 Python
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
创意活动策划书
2014/01/15 职场文书
高中军训感言200字
2014/02/23 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
高一数学教学反思
2016/02/18 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang
如何理解及使用Python闭包
2021/06/01 Python
vue3中provide && inject的使用
2021/07/01 Vue.js
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript
Oracle锁表解决方法的详细记录
2022/06/05 Oracle