再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、
2、
以上这篇让Django的BooleanField支持字符串形式的输入方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- PatriciaPaay-Playmate(ExpandedEditionRemastered2024)[24Bit-96kHz]FLAC
- 蒋志光韦绮姗.2014-传奇巨声【环星】【WAV+CUE】
- 关淑怡.2008-演唱会+无尽经典3CD【环球】【WAV+CUE】
- 伍佰.2002-冬之火九重天演唱会特选录音专辑2CD【滚石】【WAV+CUE】
- 李宗盛1996《李宗盛的凡人歌2CD》滚石[WAV+CUE][1G]
- 刘德华 《天意》1:1直刻黑胶LPCD[WAV+CUE][1.1G]
- 刘德丽2024《赤的疑惑HQCD》头版限量编号MQA[低速原抓WAV+CUE]
- 英雄联盟万圣节有什么皮肤返场 2024万圣节皮肤返场一览
- lol万圣节赠礼活动什么时候开始 2024万圣节活动时间介绍
- 2024全球总决赛blg是全华班吗 全球总决赛blg选手所属国家介绍
- 《LOL》S14半决赛:T1战胜GEN晋级决赛!对决BLG
- 《完蛋美女前传》白白演员抱怨:都没人玩我的线
- 玩家热议OLED屏对画面提升巨大:比PS5 Pro值得买
- PatriciaPaay-TheLadyIsAChamp(ExpandedEdition)(2024)[24Bit-96kHz]FLAC
- 尚士达.2024-莫回头【智慧小狗】【DTS-WAV分轨】