让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中glob模块查找文件路径的用法
Jul 05 Python
使用Python中的tkinter模块作图的方法
Feb 07 Python
python3模块smtplib实现发送邮件功能
May 22 Python
Sanic框架安装与简单入门示例
Jul 16 Python
python 解压pkl文件的方法
Oct 25 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
python字典排序的方法
Oct 12 Python
jupyter实现重新加载模块
Apr 16 Python
python3.7添加dlib模块的方法
Jul 01 Python
python如何快速生成时间戳
Jul 21 Python
详解Selenium 元素定位和WebDriver常用方法
Dec 04 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
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
javascript兼容性(实例讲解)
2017/08/15 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
python简单实现基数排序算法
2015/05/16 Python
Python实现线程池代码分享
2015/06/21 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
python检测IP地址变化并触发事件
2018/12/26 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
基于python实现坦克大战游戏
2020/10/27 Python
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
《卖火柴的小女孩》教学反思
2016/02/19 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
Python实现对齐打印 format函数的用法
2022/04/28 Python