让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使用微信SDK实现的微信支付功能示例
Jun 30 Python
利用python将图片转换成excel文档格式
Dec 30 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
Python动态导入模块的方法实例分析
Jun 28 Python
Django model序列化为json的方法示例
Oct 16 Python
Python图像处理之gif动态图的解析与合成操作详解
Dec 30 Python
使用python画社交网络图实例代码
Jul 10 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
Python中Selenium库使用教程详解
Jul 23 Python
Python基于unittest实现测试用例执行
Nov 25 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 连接mysql连接被重置的解决方法
2011/02/15 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
解析PHP中intval()等int转换时的意外异常情况
2013/06/21 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
在HTML代码中使用JavaScript代码的例子
2014/10/16 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
给学校的建议书
2014/03/12 职场文书
党建工作整改措施
2014/10/28 职场文书
六一亲子活动感想
2015/08/07 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python
我的收音机情缘
2022/04/05 无线电
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android