讓Django的BooleanField支持字符串形式的輸入方式
再Django中,你可以把字符串形式的數(shù)值賦值給IntegerField,然后Django會(huì)默認(rèn)把字符串轉(zhuǎn)換成int。
但是BooleanField則不行,BooleanField只能接受True和False,或者0和1(BTW:在python中True即是1,F(xiàn)alse即是0)。
這對(duì)于很多網(wǎng)絡(luò)參數(shù)上傳的場(chǎng)景很不利,因?yàn)楹芏鄷r(shí)候我們處于方便會(huì)將布爾型參數(shù)轉(zhuǎn)換成字符串形式來(lái)上傳。
一個(gè)典型的場(chǎng)景是在使用Swfit的Alamofire框架中的upload來(lái)上傳Multipartform時(shí),由于form參數(shù)只能添加Data形式的參數(shù),直接將Bool型轉(zhuǎn)化成Data會(huì)非常麻煩,帶來(lái)編碼類型的問(wèn)題。
例如采用如下的方式進(jìn)行轉(zhuǎn)化:
let dataToUpload = Data(bytes: boolVal, count: MemoryLayout<Bool>.size)
以這種形式上傳最后被django接收到時(shí),這個(gè)字段的值會(huì)是"\x00"(False)或者"\x01"(True),導(dǎo)致編碼類型的錯(cuò)誤。
所以一個(gè)較為方便的方法是將bool型變量轉(zhuǎn)化成字符串再上傳。
let toText = boolVal ? "1" : "0"
form.append(toText.data(using: String.Encoding.utf8, allowLossyConversion: false)!, withName: key)
不過(guò),這樣雖然避免了編碼問(wèn)題,但是在后臺(tái)賦值時(shí)直接將這個(gè)字段賦給相應(yīng)的BooleanField的話,會(huì)永遠(yuǎn)是True(這是當(dāng)然的,將字符串直接用bool()做強(qiáng)制類型轉(zhuǎn)換就會(huì)始終是True)。
一個(gè)妥協(xié)的辦法是現(xiàn)將得到的上傳的字符型字段轉(zhuǎn)換成Int,再賦值給BooleanField。
不過(guò),這里要給大家介紹一種更加整潔,更加一勞永逸的辦法,就是我們來(lái)重定義BooleanField的行為,在為其復(fù)制時(shí),自動(dòng)將字符串以我們想要的規(guī)則轉(zhuǎn)換成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)
其中g(shù)et_prep_value這個(gè)函數(shù)會(huì)在Django準(zhǔn)備把字段的值寫入數(shù)據(jù)庫(kù)時(shí)調(diào)用。
補(bǔ)充知識(shí):Dajango xadmin 設(shè)置只讀字段,設(shè)置BooleanField類型在頁(yè)面中的顯示位置
class MachineInfoAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None): """ 重新定義此函數(shù),限制普通用戶所能修改的字段 """ 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自定義字段設(shè)置排序
def identity(self,ext): return ext.user.get_types_display() identity.short_description='身份' # identity.admin_order_field = 'end_date' # 設(shè)置列表顯示字段 list_display = ['name', 'course_org', 'detail','degree','learn_times','students','fav_nums','image','click_nums','add_time'] # 設(shè)置列表查詢字段 search_field = ['name', 'course_org', 'detail','degree','learn_times','students','fav_nums','image','click_nums'] # 設(shè)置列表過(guò)濾字段 list_filter = ['name', 'course_org', 'detail','degree','learn_times','students','fav_nums','image','click_nums','add_time'] # 設(shè)置顯示圖標(biāo) model_icon = 'fa fa-check-square' # 設(shè)置字段可以直接在列表頁(yè)修改 list_editable=['desc','degree'] # 設(shè)置默認(rèn)排序 ordering=['-click_nums'] # 設(shè)置詳情頁(yè)面只讀顯示 readonly_fields=['fav_nums','click_nums'] # 設(shè)置詳情頁(yè)面不顯示某個(gè)字段 exclude=['add_time'] #自動(dòng)刷新列表頁(yè)面(秒數(shù)) refresh_times = [3,5]
三,設(shè)置BooleadnField 顯示和其他字段同列
1、
2、
以上這篇讓Django的BooleanField支持字符串形式的輸入方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python腳本爬取字體文件的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了利用python腳本爬取字體文件的實(shí)現(xiàn)方法,文中分享了爬取兩個(gè)不同網(wǎng)站的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-04-04教你使用Sublime text3搭建Python開發(fā)環(huán)境及常用插件安裝另分享Sublime text3最新激活注冊(cè)碼
這篇文章主要介紹了使用Sublime text 3搭建Python開發(fā)環(huán)境及常用插件安裝,并提供了最新Sublime text 3激活注冊(cè)碼需要的朋友可以參考下2020-11-11Django實(shí)現(xiàn)drf搜索過(guò)濾和排序過(guò)濾
當(dāng)我們需要對(duì)后臺(tái)的數(shù)據(jù)進(jìn)行過(guò)濾的時(shí)候,drf有兩種,搜索過(guò)濾和排序過(guò)濾。本文就詳細(xì)的介紹這兩種的實(shí)現(xiàn),感興趣的可以了解一下2021-06-06Python?日期和時(shí)間處理教程之datetime?模塊的使用示例詳解
Python 中的日期不是獨(dú)立的數(shù)據(jù)類型,但我們可以導(dǎo)入一個(gè)名為 datetime 的模塊來(lái)使用日期作為日期對(duì)象,這篇文章主要介紹了Python?日期和時(shí)間處理教程:datetime?模塊的使用,需要的朋友可以參考下2023-10-10Python裝飾器如何實(shí)現(xiàn)修復(fù)過(guò)程解析
這篇文章主要介紹了Python裝飾器如何實(shí)現(xiàn)修復(fù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Python Spyder 調(diào)出縮進(jìn)對(duì)齊線的操作
這篇文章主要介紹了Python Spyder 調(diào)出縮進(jìn)對(duì)齊線的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02python給指定csv表格中的聯(lián)系人群發(fā)郵件(帶附件的郵件)
這篇文章主要介紹了python給指定csv表格中的聯(lián)系人群發(fā)郵件,本文通過(guò)代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Python實(shí)現(xiàn)一個(gè)Git日志統(tǒng)計(jì)分析的小工具
這篇文章主要給大家介紹了關(guān)于利用Python如何實(shí)現(xiàn)一個(gè)Git日志統(tǒng)計(jì)分析小工具的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12