让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的源码浅要剖析Python的内存管理
Apr 16 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
Python实现的爬虫功能代码
Jun 24 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
Python处理mysql特殊字符的问题
Mar 02 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 Python
python中sys模块是做什么用的
Aug 16 Python
用python对excel查重
Dec 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/12/04 PHP
实用函数7
2007/11/08 PHP
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
解析MySql与Java的时间类型
2013/06/22 PHP
php解决安全问题的方法实例
2019/09/19 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
类似CSDN图片切换效果脚本
2009/09/17 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
Python实现的合并两个有序数组算法示例
2019/03/04 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
python中如何打包用户自定义模块
2020/09/23 Python
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
.net笔试题
2014/03/03 面试题
优秀交警事迹材料
2014/01/26 职场文书
实习评语大全
2014/04/26 职场文书
小学教师师德承诺书
2014/05/23 职场文书
教师求职自荐书
2014/06/14 职场文书
班主任工作实习计划
2015/01/16 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android