django源碼解析之 BooleanField (二)


class BooleanField(Field):
    empty_strings_allowed = False
    default_error_messages = {
        'invalid': _(u"'%s' value must be either True or False."),
    }
    description = _("Boolean (Either True or False)")

    def __init__(self, *args, **kwargs):
        kwargs['blank'] = True
        if 'default' not in kwargs and not kwargs.get('null'):
            kwargs['default'] = False
        Field.__init__(self, *args, **kwargs)

    def get_internal_type(self):
        return "BooleanField"

    def to_python(self, value):
        if value in (True, False):
            # if value is 1 or 0 than it's equal to True or False, but we want
            # to return a true bool for semantic reasons.
            return bool(value)
        if value in ('t', 'True', '1'):
            return True
        if value in ('f', 'False', '0'):
            return False
        msg = self.error_messages['invalid'] % str(value)
        raise exceptions.ValidationError(msg)

    def get_prep_lookup(self, lookup_type, value):
        # Special-case handling for filters coming from a Web request (e.g. the
        # admin interface). Only works for scalar values (not lists). If you're
        # passing in a list, you might as well make things the right type when
        # constructing the list.
        if value in ('1', '0'):
            value = bool(int(value))
        return super(BooleanField, self).get_prep_lookup(lookup_type, value)

    def get_prep_value(self, value):
        if value is None:
            return None
        return bool(value)

    def formfield(self, **kwargs):
        # Unlike most fields, BooleanField figures out include_blank from
        # self.null instead of self.blank.
        if self.choices:
            include_blank = (self.null or
                             not (self.has_default() or 'initial' in kwargs))
            defaults = {'choices': self.get_choices(
                                       include_blank=include_blank)}
        else:
            defaults = {'form_class': forms.BooleanField}
        defaults.update(kwargs)
        return super(BooleanField, self).formfield(**defaults)

看起來,BooleanField 要比復雜的多,我們只分析其中的

to_python 函數

 1     def to_python(self, value):
 2         if value in (True, False):
 3             # if value is 1 or 0 than it's equal to True or False, but we want
 4             # to return a true bool for semantic reasons.
 5             return bool(value)
 6         if value in ('t', 'True', '1'):
 7             return True
 8         if value in ('f', 'False', '0'):
 9             return False
10         msg = self.error_messages['invalid'] % str(value)
11         raise exceptions.ValidationError(msg)

函數獲得一個參數value,判斷value是不是 (True,False,1, 0)中的一個,如果是,返回True或False。

下面同理,在value是字符串的情況下,判斷value的值  是不是 ('t', 'True', '1') 中的一個,是則返回 True...

如果執行到msg = XXXXX 這里,就說明 to_python執行失敗了,返回錯誤...拋出異常...

 


 

 

需要注意的是:

>>> a = True
>>> b = False
>>> c = 1
>>> d = 0
>>> e = 11
>>> f = -1
>>> a in (True,False)
True
>>> b in (True,False)
True
>>> c in (True,False)
True
>>> d in (True,False)
True
>>> e in (True,False)
False
>>> f in (True,False)
False
>>> 

如果一個大於1的數,是不會 in (True,False) 中的,這和我們平時使用

>>> if 11:
    print 'aa'

    
aa
>>> 

是不同的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM