起因
Django 的 django.forms.BooleanField 不能傳遞 false,如果想傳,必須加上 required=False。
但這樣就和參數(shù)的必需性混了。
過程
查看 BooleanField 源碼
def to_python(self, value):
"""Returns a Python boolean object."""
# Explicitly check for the string 'False', which is what a hidden field
# will submit for False. Also check for '0', since this is what
# RadioSelect will provide. Because bool("True") == bool('1') == True,
# we don't need to handle that explicitly.
if isinstance(value, six.string_types) and value.lower() in ('false', '0'):
value = False
else:
value = bool(value)
return super(BooleanField, self).to_python(value)
def validate(self, value):
if not value and self.required:
raise ValidationError(self.error_messages['required'], code='required')
主要是 validate 函數(shù)中,false 會觸發(fā) not value,所以才不能傳 false。
解決方法
我可以動態(tài)的修改 BooleanField 的方法,參考了 django.forms.NullBooleanField 的實現(xiàn),如下:
from django.core.exceptions import ValidationError
from django.forms import BooleanField
def to_python(self, value):
if value in (True, 'True', 'true', '1'):
return True
elif value in (False, 'False', 'false', '0'):
return False
else:
return None
def validate(self, value):
if value is None and self.required:
raise ValidationError(self.error_messages['required'], code='required')
print('修復 django.forms.BooleanField 不能傳 FALSE 的 bug')
BooleanField.to_python = to_python
BooleanField.validate = validate
認知
- 動態(tài)語言和動態(tài)類型語言,靜態(tài)語言和靜態(tài)類型語言
- 動態(tài)語言:程序在運行時可以改變其結(jié)構(gòu):新的函數(shù)可以被引進,已有的函數(shù)可以被刪除等在結(jié)構(gòu)上的變化。(摘自百度百科)
- 動態(tài)類型語言:在運行期檢查變量類型的語言,編寫代碼的時候可以不指定變量的數(shù)據(jù)類型;變量沒有類型,而值有類型。
- 一個關(guān)注的是結(jié)構(gòu)的變化,一個關(guān)注的是(變量)類型的變化
- 對于動態(tài)語言,可以在不修改源碼的基礎(chǔ)上,進行功能的修改。