让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中的列表推导浅析
Apr 26 Python
教你使用python画一朵花送女朋友
Mar 29 Python
Python unittest模块用法实例分析
May 25 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
Python中的pathlib.Path为什么不继承str详解
Jun 23 Python
Python数学形态学实例分析
Sep 06 Python
python 利用turtle库绘制笑脸和哭脸的例子
Nov 23 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 Python
如何将numpy二维数组中的np.nan值替换为指定的值
May 14 Python
Python实现归一化算法详情
Mar 18 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
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
php防止sql注入简单分析
2015/03/18 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
Bootstrap插件全集
2016/07/18 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
使用webpack3.0配置webpack-dev-server教程
2018/05/29 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
python实现感知器
2017/12/19 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
pandas取出重复数据的方法
2019/07/04 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
高中学校对照检查材料
2014/08/31 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
适合青年人白手起家的创业项目分享
2019/08/16 职场文书
使用JS实现简易计算器
2021/06/14 Javascript
Windows下用Nginx配置https服务器及反向代理的问题
2021/09/25 Servers
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL