讓Django的BooleanField支持字符串形式的輸入方式
再Django中,你可以把字符串形式的數(shù)值賦值給IntegerField,然后Django會默認(rèn)把字符串轉(zhuǎn)換成int。
但是BooleanField則不行,BooleanField只能接受True和False,或者0和1(BTW:在python中True即是1,F(xiàn)alse即是0)。
這對于很多網(wǎng)絡(luò)參數(shù)上傳的場景很不利,因為很多時候我們處于方便會將布爾型參數(shù)轉(zhuǎn)換成字符串形式來上傳。
一個典型的場景是在使用Swfit的Alamofire框架中的upload來上傳Multipartform時,由于form參數(shù)只能添加Data形式的參數(shù),直接將Bool型轉(zhuǎn)化成Data會非常麻煩,帶來編碼類型的問題。
例如采用如下的方式進(jìn)行轉(zhuǎn)化:
let dataToUpload = Data(bytes: boolVal, count: MemoryLayout<Bool>.size)
以這種形式上傳最后被django接收到時,這個字段的值會是'x00'(False)或者'x01'(True),導(dǎo)致編碼類型的錯誤。
所以一個較為方便的方法是將bool型變量轉(zhuǎn)化成字符串再上傳。
let toText = boolVal ? '1' : '0'form.append(toText.data(using: String.Encoding.utf8, allowLossyConversion: false)!, withName: key)
不過,這樣雖然避免了編碼問題,但是在后臺賦值時直接將這個字段賦給相應(yīng)的BooleanField的話,會永遠(yuǎn)是True(這是當(dāng)然的,將字符串直接用bool()做強制類型轉(zhuǎn)換就會始終是True)。
一個妥協(xié)的辦法是現(xiàn)將得到的上傳的字符型字段轉(zhuǎn)換成Int,再賦值給BooleanField。
不過,這里要給大家介紹一種更加整潔,更加一勞永逸的辦法,就是我們來重定義BooleanField的行為,在為其復(fù)制時,自動將字符串以我們想要的規(guī)則轉(zhuǎn)換成Bool值。
代碼如下:
from django.db.models import BooleanField as _BooleanFieldclass BooleanField(_BooleanField): def get_prep_value(self, value):if value in ('0', 'false', 'False'): return Falseelif value in ('1', 'true', 'True'): return Trueelse: return super(BooleanField, self).get_prep_value(value)
其中g(shù)et_prep_value這個函數(shù)會在Django準(zhǔn)備把字段的值寫入數(shù)據(jù)庫時調(diào)用。
補充知識:Dajango xadmin 設(shè)置只讀字段,設(shè)置BooleanField類型在頁面中的顯示位置
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è)置列表過濾字段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è)置字段可以直接在列表頁修改 list_editable=[’desc’,’degree’]# 設(shè)置默認(rèn)排序ordering=[’-click_nums’]# 設(shè)置詳情頁面只讀顯示readonly_fields=[’fav_nums’,’click_nums’]# 設(shè)置詳情頁面不顯示某個字段exclude=[’add_time’]#自動刷新列表頁面(秒數(shù))refresh_times = [3,5]
三,設(shè)置BooleadnField 顯示和其他字段同列
1、
2、
以上這篇讓Django的BooleanField支持字符串形式的輸入方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 解析原生JS getComputedStyle2. Idea 2019.3 本應(yīng)該搜索到的插件卻搜索不到的解決方法3. SpringBoot+SpringCache實現(xiàn)兩級緩存(Redis+Caffeine)4. IntelliJ IDEA安裝插件的方法步驟5. 在JSP中使用formatNumber控制要顯示的小數(shù)位數(shù)方法6. ASP.NET MVC視圖頁使用jQuery傳遞異步數(shù)據(jù)的幾種方式詳解7. ASP.NET泛型三之使用協(xié)變和逆變實現(xiàn)類型轉(zhuǎn)換8. IntelliJ IDEA導(dǎo)入jar包的方法9. 每日六道java新手入門面試題,通往自由的道路10. 每日六道java新手入門面試題,通往自由的道路--多線程
