再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支持字符串形式的输入方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]