让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实现爬虫下载美女图片
Jul 14 Python
Linux系统上Nginx+Python的web.py与Django框架环境
Dec 25 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
Python登录系统界面实现详解
Jun 25 Python
Python tkinter模版代码实例
Feb 05 Python
Python 定义只读属性的实现方式
Mar 05 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
Dec 04 Python
Python 用__new__方法实现单例的操作
Dec 11 Python
Python pygame实现中国象棋单机版源码
Jun 20 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如何透过ODBC来存取数据库
2006/10/09 PHP
php实现的遍历文件夹下所有文件,编辑删除
2010/01/05 PHP
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
javascript实现画板功能
2020/04/12 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
shell程序中如何注释
2012/02/17 面试题
简单的JAVA编程面试题
2013/03/19 面试题
高级护理专业大学生求职信
2013/10/24 职场文书
机电一体化职业规划书
2014/01/07 职场文书
个人对照检查材料
2014/02/12 职场文书
《英英学古诗》教学反思
2014/04/11 职场文书
完美的中文自荐信
2014/05/24 职场文书
助学金感谢信
2015/01/20 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android
Python实现对齐打印 format函数的用法
2022/04/28 Python