Django

Code

Ticket #6302: pass_initial_through_with_tests_2.diff

File pass_initial_through_with_tests_2.diff, 41.2 kB (added by brosner, 9 months ago)

this might be overkill, but initial data is now passed to field.clean. should FileField? be special cased?

  • a/django/contrib/localflavor/ar/forms.py

    old new  
    3232        super(ARPostalCodeField, self).__init__(r'^\d{4}$|^[A-HJ-NP-Za-hj-np-z]\d{4}\D{3}$', 
    3333            min_length=4, max_length=8, *args, **kwargs) 
    3434 
    35     def clean(self, value): 
    36         value = super(ARPostalCodeField, self).clean(value
     35    def clean(self, value, initial=None): 
     36        value = super(ARPostalCodeField, self).clean(value, initial
    3737        if value in EMPTY_VALUES: 
    3838            return u'' 
    3939        if len(value) not in (4, 8): 
     
    5555        super(ARDNIField, self).__init__(max_length=10, min_length=7, *args, 
    5656                **kwargs) 
    5757 
    58     def clean(self, value): 
     58    def clean(self, value, initial=None): 
    5959        """ 
    6060        Value can be a string either in the [X]X.XXX.XXX or [X]XXXXXXX formats. 
    6161        """ 
    62         value = super(ARDNIField, self).clean(value
     62        value = super(ARDNIField, self).clean(value, initial
    6363        if value in EMPTY_VALUES: 
    6464            return u'' 
    6565        if not value.isdigit(): 
     
    8585        super(ARCUITField, self).__init__(r'^\d{2}-?\d{8}-?\d$', 
    8686            *args, **kwargs) 
    8787 
    88     def clean(self, value): 
     88    def clean(self, value, initial=None): 
    8989        """ 
    9090        Value can be either a string in the format XX-XXXXXXXX-X or an 
    9191        11-digit number. 
    9292        """ 
    93         value = super(ARCUITField, self).clean(value
     93        value = super(ARCUITField, self).clean(value, initial
    9494        if value in EMPTY_VALUES: 
    9595            return u'' 
    9696        value, cd = self._canon(value) 
  • a/django/contrib/localflavor/au/forms.py

    old new  
    2626        'invalid': u'Phone numbers must contain 10 digits.', 
    2727    } 
    2828 
    29     def clean(self, value): 
     29    def clean(self, value, initial=None): 
    3030        """ 
    3131        Validate a phone number. Strips parentheses, whitespace and hyphens. 
    3232        """ 
    33         super(AUPhoneNumberField, self).clean(value
     33        super(AUPhoneNumberField, self).clean(value, initial
    3434        if value in EMPTY_VALUES: 
    3535            return u'' 
    3636        value = re.sub('(\(|\)|\s+|-)', '', smart_unicode(value)) 
  • a/django/contrib/localflavor/br/forms.py

    old new  
    3030        'invalid': _('Phone numbers must be in XX-XXXX-XXXX format.'), 
    3131    } 
    3232 
    33     def clean(self, value): 
    34         super(BRPhoneNumberField, self).clean(value
     33    def clean(self, value, initial=None): 
     34        super(BRPhoneNumberField, self).clean(value, initial
    3535        if value in EMPTY_VALUES: 
    3636            return u'' 
    3737        value = re.sub('(\(|\)|\s+)', '', smart_unicode(value)) 
     
    6565        from br_states import STATE_CHOICES 
    6666        self.widget.choices = STATE_CHOICES 
    6767 
    68     def clean(self, value): 
    69         value = super(BRStateChoiceField, self).clean(value
     68    def clean(self, value, initial=None): 
     69        value = super(BRStateChoiceField, self).clean(value, initial
    7070        if value in EMPTY_VALUES: 
    7171            value = u'' 
    7272        value = smart_unicode(value) 
     
    9999    def __init__(self, *args, **kwargs): 
    100100        super(BRCPFField, self).__init__(max_length=14, min_length=11, *args, **kwargs) 
    101101 
    102     def clean(self, value): 
     102    def clean(self, value, initial=None): 
    103103        """ 
    104104        Value can be either a string in the format XXX.XXX.XXX-XX or an 
    105105        11-digit number. 
    106106        """ 
    107         value = super(BRCPFField, self).clean(value
     107        value = super(BRCPFField, self).clean(value, initial
    108108        if value in EMPTY_VALUES: 
    109109            return u'' 
    110110        orig_value = value[:] 
     
    136136        'max_digits': _("This field requires at least 14 digits"), 
    137137    } 
    138138 
    139     def clean(self, value): 
     139    def clean(self, value, initial=None): 
    140140        """ 
    141141        Value can be either a string in the format XX.XXX.XXX/XXXX-XX or a 
    142142        group of 14 characters. 
    143143        """ 
    144         value = super(BRCNPJField, self).clean(value
     144        value = super(BRCNPJField, self).clean(value, initial
    145145        if value in EMPTY_VALUES: 
    146146            return u'' 
    147147        orig_value = value[:] 
  • a/django/contrib/localflavor/ca/forms.py

    old new  
    2727        'invalid': u'Phone numbers must be in XXX-XXX-XXXX format.', 
    2828    } 
    2929 
    30     def clean(self, value): 
     30    def clean(self, value, initial=None): 
    3131        """Validate a phone number. 
    3232        """ 
    33         super(CAPhoneNumberField, self).clean(value
     33        super(CAPhoneNumberField, self).clean(value, initial
    3434        if value in EMPTY_VALUES: 
    3535            return u'' 
    3636        value = re.sub('(\(|\)|\s+)', '', smart_unicode(value)) 
     
    4949        'invalid': u'Enter a Canadian province or territory.', 
    5050    } 
    5151 
    52     def clean(self, value): 
     52    def clean(self, value, initial=None): 
    5353        from ca_provinces import PROVINCES_NORMALIZED 
    54         super(CAProvinceField, self).clean(value
     54        super(CAProvinceField, self).clean(value, initial
    5555        if value in EMPTY_VALUES: 
    5656            return u'' 
    5757        try: 
     
    8888        'invalid': ugettext('Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format.'), 
    8989    } 
    9090 
    91     def clean(self, value): 
    92         super(CASocialInsuranceNumberField, self).clean(value
     91    def clean(self, value, initial=None): 
     92        super(CASocialInsuranceNumberField, self).clean(value, initial
    9393        if value in EMPTY_VALUES: 
    9494            return u'' 
    9595 
  • a/django/contrib/localflavor/ch/forms.py

    old new  
    3131        'invalid': 'Phone numbers must be in 0XX XXX XX XX format.', 
    3232    } 
    3333 
    34     def clean(self, value): 
    35         super(CHPhoneNumberField, self).clean(value
     34    def clean(self, value, initial=None): 
     35        super(CHPhoneNumberField, self).clean(value, initial
    3636        if value in EMPTY_VALUES: 
    3737            return u'' 
    3838        value = re.sub('(\.|\s|/|-)', '', smart_unicode(value)) 
     
    9595 
    9696        return str(calculated_checksum)[-1] == given_checksum 
    9797 
    98     def clean(self, value): 
    99         super(CHIdentityCardNumberField, self).clean(value
     98    def clean(self, value, initial=None): 
     99        super(CHIdentityCardNumberField, self).clean(value, initial
    100100        if value in EMPTY_VALUES: 
    101101            return u'' 
    102102 
  • a/django/contrib/localflavor/cl/forms.py

    old new  
    4141            # the real world. 
    4242            super(CLRutField, self).__init__(r'^[\d\.]{1,11}-?[\dkK]$', *args, **kwargs) 
    4343 
    44     def clean(self, value): 
     44    def clean(self, value, initial=None): 
    4545        """ 
    4646        Check and clean the Chilean RUT. 
    4747        """ 
    48         super(CLRutField, self).clean(value
     48        super(CLRutField, self).clean(value, initial
    4949        if value in EMPTY_VALUES: 
    5050            return u'' 
    5151        rut, verificador = self._canonify(value) 
  • a/django/contrib/localflavor/de/forms.py

    old new  
    6060 
    6161        return str(calculated_checksum)[-1] == given_checksum 
    6262 
    63     def clean(self, value): 
    64         super(DEIdentityCardNumberField, self).clean(value
     63    def clean(self, value, initial=None): 
     64        super(DEIdentityCardNumberField, self).clean(value, initial
    6565        if value in EMPTY_VALUES: 
    6666            return u'' 
    6767        match = re.match(id_re, value) 
  • a/django/contrib/localflavor/es/forms.py

    old new  
    8181                error_message=self.default_error_messages['invalid%s' % (self.only_nif and '_only_nif' or '')], 
    8282                *args, **kwargs) 
    8383 
    84     def clean(self, value): 
    85         super(ESIdentityCardNumberField, self).clean(value
     84    def clean(self, value, initial=None): 
     85        super(ESIdentityCardNumberField, self).clean(value, initial
    8686        if value in EMPTY_VALUES: 
    8787            return u'' 
    8888        nif_get_checksum = lambda d: self.nif_control[int(d)%23] 
     
    147147        super(ESCCCField, self).__init__(r'^\d{4}[ -]?\d{4}[ -]?\d{2}[ -]?\d{10}$', 
    148148            max_length=None, min_length=None, *args, **kwargs) 
    149149 
    150     def clean(self, value): 
    151         super(ESCCCField, self).clean(value
     150    def clean(self, value, initial=None): 
     151        super(ESCCCField, self).clean(value, initial
    152152        if value in EMPTY_VALUES: 
    153153            return u'' 
    154154        control_str = [1, 2, 4, 8, 5, 10, 9, 7, 3, 6] 
  • a/django/contrib/localflavor/fi/forms.py

    old new  
    2828        'invalid': ugettext('Enter a valid Finnish social security number.'), 
    2929    } 
    3030 
    31     def clean(self, value): 
    32         super(FISocialSecurityNumber, self).clean(value
     31    def clean(self, value, initial=None): 
     32        super(FISocialSecurityNumber, self).clean(value, initial
    3333        if value in EMPTY_VALUES: 
    3434            return u'' 
    3535 
  • a/django/contrib/localflavor/fr/forms.py

    old new  
    3030        'invalid': u'Phone numbers must be in 0X XX XX XX XX format.', 
    3131    } 
    3232 
    33     def clean(self, value): 
    34         super(FRPhoneNumberField, self).clean(value
     33    def clean(self, value, initial=None): 
     34        super(FRPhoneNumberField, self).clean(value, initial
    3535        if value in EMPTY_VALUES: 
    3636            return u'' 
    3737        value = re.sub('(\.|\s)', '', smart_unicode(value)) 
  • a/django/contrib/localflavor/in_/forms.py

    old new  
    2828        'invalid': u'Enter a Indian state or territory.', 
    2929    } 
    3030 
    31     def clean(self, value): 
     31    def clean(self, value, initial=None): 
    3232        from in_states import STATES_NORMALIZED 
    33         super(INStateField, self).clean(value
     33        super(INStateField, self).clean(value, initial
    3434        if value in EMPTY_VALUES: 
    3535            return u'' 
    3636        try: 
  • a/django/contrib/localflavor/is_/forms.py

    old new  
    2222        kwargs['min_length'],kwargs['max_length'] = 10,11 
    2323        super(ISIdNumberField, self).__init__(r'^\d{6}(-| )?\d{4}$', *args, **kwargs) 
    2424 
    25     def clean(self, value): 
    26         value = super(ISIdNumberField, self).clean(value
     25    def clean(self, value, initial=None): 
     26        value = super(ISIdNumberField, self).clean(value, initial
    2727 
    2828        if value in EMPTY_VALUES: 
    2929            return u'' 
     
    6464        kwargs['min_length'], kwargs['max_length'] = 7,8 
    6565        super(ISPhoneNumberField, self).__init__(r'^\d{3}(-| )?\d{4}$', *args, **kwargs) 
    6666 
    67     def clean(self, value): 
    68         value = super(ISPhoneNumberField, self).clean(value
     67    def clean(self, value, initial=None): 
     68        value = super(ISPhoneNumberField, self).clean(value, initial
    6969 
    7070        if value in EMPTY_VALUES: 
    7171            return u'' 
  • a/django/contrib/localflavor/it/forms.py

    old new  
    4747        super(ITSocialSecurityNumberField, self).__init__(r'^\w{3}\s*\w{3}\s*\w{5}\s*\w{5}$', 
    4848        max_length=None, min_length=None, *args, **kwargs) 
    4949 
    50     def clean(self, value): 
    51         value = super(ITSocialSecurityNumberField, self).clean(value
     50    def clean(self, value, initial=None): 
     51        value = super(ITSocialSecurityNumberField, self).clean(value, initial
    5252        if value == u'': 
    5353            return value 
    5454        value = re.sub('\s', u'', value).upper() 
     
    6868        'invalid': ugettext(u'Enter a valid VAT number.'), 
    6969    } 
    7070 
    71     def clean(self, value): 
    72         value = super(ITVatNumberField, self).clean(value
     71    def clean(self, value, initial=None): 
     72        value = super(ITVatNumberField, self).clean(value, initial
    7373        if value == u'': 
    7474            return value 
    7575        try: 
  • a/django/contrib/localflavor/jp/forms.py

    old new  
    2323        super(JPPostalCodeField, self).__init__(r'^\d{3}-\d{4}$|^\d{7}$', 
    2424            max_length=None, min_length=None, *args, **kwargs) 
    2525 
    26     def clean(self, value): 
     26    def clean(self, value, initial=None): 
    2727        """ 
    2828        Validates the input and returns a string that contains only numbers. 
    2929        Returns an empty string for empty values. 
    3030        """ 
    31         v = super(JPPostalCodeField, self).clean(value
     31        v = super(JPPostalCodeField, self).clean(value, initial
    3232        return v.replace('-', '') 
    3333 
    3434class JPPrefectureSelect(Select): 
  • a/django/contrib/localflavor/nl/forms.py

    old new  
    2121        'invalid': _('Enter a valid postal code'), 
    2222    } 
    2323 
    24     def clean(self, value): 
    25         super(NLZipCodeField, self).clean(value
     24    def clean(self, value, initial=None): 
     25        super(NLZipCodeField, self).clean(value, initial
    2626        if value in EMPTY_VALUES: 
    2727            return u'' 
    2828 
     
    5252        'invalid': _('Enter a valid phone number'), 
    5353    } 
    5454 
    55     def clean(self, value): 
    56         super(NLPhoneNumberField, self).clean(value
     55    def clean(self, value, initial=None): 
     56        super(NLPhoneNumberField, self).clean(value, initial
    5757        if value in EMPTY_VALUES: 
    5858            return u'' 
    5959 
     
    7878        'invalid': _('Enter a valid SoFi number'), 
    7979    } 
    8080 
    81     def clean(self, value): 
    82         super(NLSoFiNumberField, self).clean(value
     81    def clean(self, value, initial=None): 
     82        super(NLSoFiNumberField, self).clean(value, initial
    8383        if value in EMPTY_VALUES: 
    8484            return u'' 
    8585 
  • a/django/contrib/localflavor/no/forms.py

    old new  
    3333        'invalid': ugettext(u'Enter a valid Norwegian social security number.'), 
    3434    } 
    3535 
    36     def clean(self, value): 
    37         super(NOSocialSecurityNumber, self).clean(value
     36    def clean(self, value, initial=None): 
     37        super(NOSocialSecurityNumber, self).clean(value, initial
    3838        if value in EMPTY_VALUES: 
    3939            return u'' 
    4040 
  • a/django/contrib/localflavor/pe/forms.py

    old new  
    2828        super(PEDNIField, self).__init__(max_length=8, min_length=8, *args, 
    2929                **kwargs) 
    3030 
    31     def clean(self, value): 
     31    def clean(self, value, initial=None): 
    3232        """ 
    3333        Value must be a string in the XXXXXXXX formats. 
    3434        """ 
    35         value = super(PEDNIField, self).clean(value
     35        value = super(PEDNIField, self).clean(value, initial
    3636        if value in EMPTY_VALUES: 
    3737            return u'' 
    3838        if not value.isdigit(): 
     
    5656        super(PERUCField, self).__init__(max_length=11, min_length=11, *args, 
    5757            **kwargs) 
    5858 
    59     def clean(self, value): 
     59    def clean(self, value, initial=None): 
    6060        """ 
    6161        Value must be an 11-digit number. 
    6262        """ 
    63         value = super(PERUCField, self).clean(value
     63        value = super(PERUCField, self).clean(value, initial
    6464        if value in EMPTY_VALUES: 
    6565            return u'' 
    6666        if not value.isdigit(): 
  • a/django/contrib/localflavor/pl/forms.py

    old new  
    4444        super(PLNationalIdentificationNumberField, self).__init__(r'^\d{11}$', 
    4545            max_length=None, min_length=None, *args, **kwargs) 
    4646 
    47     def clean(self,value): 
    48         super(PLNationalIdentificationNumberField, self).clean(value
     47    def clean(self, value, initial=None): 
     48        super(PLNationalIdentificationNumberField, self).clean(value, initial
    4949        if not self.has_valid_checksum(value): 
    5050            raise ValidationError(self.error_messages['checksum']) 
    5151        return u'%s' % value 
     
    7777        super(PLTaxNumberField, self).__init__(r'^\d{3}-\d{3}-\d{2}-\d{2}$|^\d{2}-\d{2}-\d{3}-\d{3}$', 
    7878            max_length=None, min_length=None, *args, **kwargs) 
    7979 
    80     def clean(self,value): 
    81         super(PLTaxNumberField, self).clean(value
     80    def clean(self, value, initial=None): 
     81        super(PLTaxNumberField, self).clean(value, initial
    8282        value = re.sub("[-]", "", value) 
    8383        if not self.has_valid_checksum(value): 
    8484            raise ValidationError(self.error_messages['checksum']) 
     
    117117        super(PLNationalBusinessRegisterField, self).__init__(r'^\d{7,9}$', 
    118118            max_length=None, min_length=None, *args, **kwargs) 
    119119 
    120     def clean(self,value): 
    121         super(PLNationalBusinessRegisterField, self).clean(value
     120    def clean(self, value, initial=None): 
     121        super(PLNationalBusinessRegisterField, self).clean(value, initial
    122122        if not self.has_valid_checksum(value): 
    123123            raise ValidationError(self.error_messages['checksum']) 
    124124        return u'%s' % value 
  • a/django/contrib/localflavor/sk/forms.py

    old new  
    3434        super(SKPostalCodeField, self).__init__(r'^\d{5}$|^\d{3} \d{2}$', 
    3535            max_length=None, min_length=None, *args, **kwargs) 
    3636 
    37     def clean(self, value): 
     37    def clean(self, value, initial=None): 
    3838        """ 
    3939        Validates the input and returns a string that contains only numbers. 
    4040        Returns an empty string for empty values. 
    4141        """ 
    42         v = super(SKPostalCodeField, self).clean(value
     42        v = super(SKPostalCodeField, self).clean(value, initial
    4343        return v.replace(' ', '') 
  • a/django/contrib/localflavor/uk/forms.py

    old new  
    2525    postcode_regex = re.compile(r'^(GIR 0AA|%s %s)$' % (outcode_pattern, incode_pattern)) 
    2626    space_regex = re.compile(r' *(%s)$' % incode_pattern) 
    2727 
    28     def clean(self, value): 
    29         value = super(UKPostcodeField, self).clean(value
     28    def clean(self, value, initial=None): 
     29        value = super(UKPostcodeField, self).clean(value, initial
    3030        if value == u'': 
    3131            return value 
    3232        postcode = value.upper().strip() 
  • a/django/contrib/localflavor/us/forms.py

    old new  
    2525        'invalid': u'Phone numbers must be in XXX-XXX-XXXX format.', 
    2626    } 
    2727 
    28     def clean(self, value): 
    29         super(USPhoneNumberField, self).clean(value
     28    def clean(self, value, initial=None): 
     29        super(USPhoneNumberField, self).clean(value, initial
    3030        if value in EMPTY_VALUES: 
    3131            return u'' 
    3232        value = re.sub('(\(|\)|\s+)', '', smart_unicode(value)) 
     
    5454        'invalid': ugettext('Enter a valid U.S. Social Security number in XXX-XX-XXXX format.'), 
    5555    } 
    5656 
    57     def clean(self, value): 
    58         super(USSocialSecurityNumberField, self).clean(value
     57    def clean(self, value, initial=None): 
     58        super(USSocialSecurityNumberField, self).clean(value, initial
    5959        if value in EMPTY_VALUES: 
    6060            return u'' 
    6161        match = re.match(ssn_re, value) 
     
    8787        'invalid': u'Enter a U.S. state or territory.', 
    8888    } 
    8989 
    90     def clean(self, value): 
     90    def clean(self, value, initial=None): 
    9191        from us_states import STATES_NORMALIZED 
    92         super(USStateField, self).clean(value
     92        super(USStateField, self).clean(value, initial
    9393        if value in EMPTY_VALUES: 
    9494            return u'' 
    9595        try: 
  • a/django/contrib/localflavor/za/forms.py

    old new  
    2020        'invalid': _(u'Enter a valid South African ID number'), 
    2121    } 
    2222 
    23     def clean(self, value): 
     23    def clean(self, value, initial=None): 
    2424        # strip spaces and dashes 
    2525        value = value.strip().replace(' ', '').replace('-', '') 
    2626 
    27         super(ZAIDField, self).clean(value
     27        super(ZAIDField, self).clean(value, initial
    2828 
    2929        if value in EMPTY_VALUES: 
    3030            return u'' 
  • a/django/db/models/fields/__init__.py

    old new  
    797797        return os.path.normpath(f) 
    798798 
    799799    def save_form_data(self, instance, data): 
    800         if data: 
     800        from django.newforms.fields import UploadedFile 
     801        if data and isinstance(data, UploadedFile): 
    801802            getattr(instance, "save_%s_file" % self.name)(data.filename, data.content, save=False) 
    802803 
    803804    def formfield(self, **kwargs): 
    804805        defaults = {'form_class': forms.FileField} 
    805         # If a file has been provided previously, then the form doesn't require 
    806         # that a new file is provided this time. 
    807         if 'initial' in kwargs: 
    808             defaults['required'] = False 
    809806        defaults.update(kwargs) 
    810807        return super(FileField, self).formfield(**defaults) 
    811808 
  • a/django/newforms/fields.py

    old new  
    9393        messages.update(error_messages or {}) 
    9494        self.error_messages = messages 
    9595 
    96     def clean(self, value): 
     96    def clean(self, value, initial=None): 
    9797        """ 
    9898        Validates the given value and returns its "cleaned" value as an 
    9999        appropriate Python object. 
     
    128128        self.max_length, self.min_length = max_length, min_length 
    129129        super(CharField, self).__init__(*args, **kwargs) 
    130130 
    131     def clean(self, value): 
     131    def clean(self, value, initial=None): 
    132132        "Validates max_length and min_length. Returns a Unicode object." 
    133         super(CharField, self).clean(value
     133        super(CharField, self).clean(value, initial
    134134        if value in EMPTY_VALUES: 
    135135            return u'' 
    136136        value = smart_unicode(value) 
     
    157157        self.max_value, self.min_value = max_value, min_value 
    158158        super(IntegerField, self).__init__(*args, **kwargs) 
    159159 
    160     def clean(self, value): 
     160    def clean(self, value, initial=None): 
    161161        """ 
    162162        Validates that int() can be called on the input. Returns the result 
    163163        of int(). Returns None for empty values. 
    164164        """ 
    165         super(IntegerField, self).clean(value
     165        super(IntegerField, self).clean(value, initial
    166166        if value in EMPTY_VALUES: 
    167167            return None 
    168168        try: 
     
    186186        self.max_value, self.min_value = max_value, min_value 
    187187        Field.__init__(self, *args, **kwargs) 
    188188 
    189     def clean(self, value): 
     189    def clean(self, value, initial=None): 
    190190        """ 
    191191        Validates that float() can be called on the input. Returns a float. 
    192192        Returns None for empty values. 
    193193        """ 
    194         super(FloatField, self).clean(value
     194        super(FloatField, self).clean(value, initial
    195195        if not self.required and value in EMPTY_VALUES: 
    196196            return None 
    197197        try: 
     
    219219        self.max_digits, self.decimal_places = max_digits, decimal_places 
    220220        Field.__init__(self, *args, **kwargs) 
    221221 
    222     def clean(self, value): 
     222    def clean(self, value, initial=None): 
    223223        """ 
    224224        Validates that the input is a decimal number. Returns a Decimal 
    225225        instance. Returns None for empty values. Ensures that there are no more 
    226226        than max_digits in the number, and no more than decimal_places digits 
    227227        after the decimal point. 
    228228        """ 
    229         super(DecimalField, self).clean(value
     229        super(DecimalField, self).clean(value, initial
    230230        if not self.required and value in EMPTY_VALUES: 
    231231            return None 
    232232        value = smart_str(value).strip() 
     
    266266        super(DateField, self).__init__(*args, **kwargs) 
    267267        self.input_formats = input_formats or DEFAULT_DATE_INPUT_FORMATS 
    268268 
    269     def clean(self, value): 
     269    def clean(self, value, initial=None): 
    270270        """ 
    271271        Validates that the input can be converted to a date. Returns a Python 
    272272        datetime.date object. 
    273273        """ 
    274         super(DateField, self).clean(value
     274        super(DateField, self).clean(value, initial
    275275        if value in EMPTY_VALUES: 
    276276            return None 
    277277        if isinstance(value, datetime.datetime): 
     
    299299        super(TimeField, self).__init__(*args, **kwargs) 
    300300        self.input_formats = input_formats or DEFAULT_TIME_INPUT_FORMATS 
    301301 
    302     def clean(self, value): 
     302    def clean(self, value, initial=None): 
    303303        """ 
    304304        Validates that the input can be converted to a time. Returns a Python 
    305305        datetime.time object. 
    306306        """ 
    307         super(TimeField, self).clean(value
     307        super(TimeField, self).clean(value, initial
    308308        if value in EMPTY_VALUES: 
    309309            return None 
    310310        if isinstance(value, datetime.time): 
     
    338338        super(DateTimeField, self).__init__(*args, **kwargs) 
    339339        self.input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS 
    340340 
    341     def clean(self, value): 
     341    def clean(self, value, initial=None): 
    342342        """ 
    343343        Validates that the input can be converted to a datetime. Returns a 
    344344        Python datetime.datetime object. 
    345345        """ 
    346         super(DateTimeField, self).clean(value
     346        super(DateTimeField, self).clean(value, initial
    347347        if value in EMPTY_VALUES: 
    348348            return None 
    349349        if isinstance(value, datetime.datetime): 
     
    380380            regex = re.compile(regex) 
    381381        self.regex = regex 
    382382 
    383     def clean(self, value): 
     383    def clean(self, value, initial=None): 
    384384        """ 
    385385        Validates that the input matches the regular expression. Returns a 
    386386        Unicode object. 
    387387        """ 
    388         value = super(RegexField, self).clean(value
     388        value = super(RegexField, self).clean(value, initial
    389389        if value == u'': 
    390390            return value 
    391391        if not self.regex.search(value): 
     
    437437    def __init__(self, *args, **kwargs): 
    438438        super(FileField, self).__init__(*args, **kwargs) 
    439439 
    440     def clean(self, data): 
    441         super(FileField, self).clean(data) 
     440    def clean(self, data, initial=None): 
     441        super(FileField, self).clean(initial or data) 
    442442        if not self.required and data in EMPTY_VALUES: 
    443443            return None 
     444        elif not data and initial: 
     445            return initial 
    444446        try: 
    445447            f = UploadedFile(data['filename'], data['content']) 
    446448        except TypeError: 
     
    456458        'invalid_image': _(u"Upload a valid image. The file you uploaded was either not an image or a corrupted image."), 
    457459    } 
    458460 
    459     def clean(self, data): 
     461    def clean(self, data, initial): 
    460462        """ 
    461463        Checks that the file-upload field data contains a valid image (GIF, JPG, 
    462464        PNG, possibly others -- whatever the Python Imaging Library supports). 
    463465        """ 
    464         f = super(ImageField, self).clean(data
     466        f = super(ImageField, self).clean(data, initial
    465467        if f is None: 
    466468            return None 
    467469        from PIL import Image 
     
    500502        self.verify_exists = verify_exists 
    501503        self.user_agent = validator_user_agent 
    502504 
    503     def clean(self, value): 
     505    def clean(self, value, initial=None): 
    504506        # If no URL scheme given, assume http:// 
    505507        if value and '://' not in value: 
    506508            value = u'http://%s' % value 
    507         value = super(URLField, self).clean(value
     509        value = super(URLField, self).clean(value, initial
    508510        if value == u'': 
    509511            return value 
    510512        if self.verify_exists: 
     
    529531class BooleanField(Field): 
    530532    widget = CheckboxInput 
    531533 
    532     def clean(self, value): 
     534    def clean(self, value, initial=None): 
    533535        """Returns a Python boolean object.""" 
    534         super(BooleanField, self).clean(value
     536        super(BooleanField, self).clean(value, initial
    535537        # Explicitly check for the string 'False', which is what a hidden field 
    536538        # will submit for False. Because bool("True") == True, we don't need to 
    537539        # handle that explicitly. 
     
    546548    """ 
    547549    widget = NullBooleanSelect 
    548550 
    549     def clean(self, value): 
     551    def clean(self, value, initial=None): 
    550552        return {True: True, False: False}.get(value, None) 
    551553 
    552554class ChoiceField(Field): 
     
    572574 
    573575    choices = property(_get_choices, _set_choices) 
    574576 
    575     def clean(self, value): 
     577    def clean(self, value, initial=None): 
    576578        """ 
    577579        Validates that the input is in self.choices. 
    578580        """ 
    579         value = super(ChoiceField, self).clean(value
     581        value = super(ChoiceField, self).clean(value, initial
    580582        if value in EMPTY_VALUES: 
    581583            value = u'' 
    582584        value = smart_unicode(value) 
     
    595597        'invalid_list': _(u'Enter a list of values.'), 
    596598    } 
    597599 
    598     def clean(self, value): 
     600    def clean(self, value, initial=None): 
    599601        """ 
    600602        Validates that the input is a list or tuple. 
    601603        """ 
     
    626628            f.required = False 
    627629        self.fields = fields 
    628630 
    629     def clean(self, value): 
     631    def clean(self, value, initial=None): 
    630632        """ 
    631633        Validates the given value against all of self.fields, which is a 
    632634        list of Field instances. 
    633635        """ 
    634         super(ComboField, self).clean(value
     636        super(ComboField, self).clean(value, initial
    635637        for field in self.fields: 
    636             value = field.clean(value
     638            value = field.clean(value, initial
    637639        return value 
    638640 
    639641class MultiValueField(Field): 
     
    666668            f.required = False 
    667669        self.fields = fields 
    668670 
    669     def clean(self, value): 
     671    def clean(self, value, initial=None): 
    670672        """ 
    671673        Validates every value in the given list. A value is validated against 
    672674        the corresponding Field in self.fields. 
  • a/django/newforms/forms.py

    old new  
    181181            # Each widget type knows how to retrieve its own data, because some 
    182182            # widgets split data over several HTML fields. 
    183183            value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) 
     184            initial = field.widget.value_from_initialdict(self.initial, name) 
    184185            try: 
    185                 value = field.clean(value
     186                value = field.clean(value, initial
    186187                self.cleaned_data[name] = value 
    187188                if hasattr(self, 'clean_%s' % name): 
    188189                    value = getattr(self, 'clean_%s' % name)() 
  • a/django/newforms/models.py

    old new  
    360360 
    361361    choices = property(_get_choices, _set_choices) 
    362362 
    363     def clean(self, value): 
     363    def clean(self, value, initial=None): 
    364364        Field.clean(self, value) 
    365365        if value in EMPTY_VALUES: 
    366366            return None 
     
    386386            cache_choices, required, widget, label, initial, help_text, 
    387387            *args, **kwargs) 
    388388 
    389     def clean(self, value): 
     389    def clean(self, value, initial=None): 
    390390        if self.required and not value: 
    391391            raise ValidationError(self.error_messages['required']) 
    392392        elif not self.required and not value: 
  • a/django/newforms/widgets.py

    old new  
    7777        return id_ 
    7878    id_for_label = classmethod(id_for_label) 
    7979 
     80    def value_from_initialdict(self, initial, name): 
     81        """ 
     82        Given a dictionary of initial data return the value for this widget. 
     83        Returns None if it's not provided. 
     84        """ 
     85        if name in initial: 
     86            return initial[name] 
     87        return None 
     88 
    8089class Input(Widget): 
    8190    """ 
    8291    Base class for all <input> widgets (except type='checkbox' and 
  • a/docs/newforms.txt

    old new  
    15941594    from django import newforms as forms 
    15951595 
    15961596    class MultiEmailField(forms.Field): 
    1597         def clean(self, value): 
     1597        def clean(self, value, initial=None): 
    15981598            if not value: 
    15991599                raise forms.ValidationError('Enter at least one e-mail address.') 
    16001600            emails = value.split(',') 
  • a/tests/modeltests/model_forms/models.py

    old new  
    77most of these tests should be rewritten. 
    88""" 
    99 
     10import os 
     11import tempfile 
     12 
    1013from django.db import models 
    1114 
    1215ARTICLE_STATUS = ( 
     
    5558    def __unicode__(self): 
    5659        return self.phone 
    5760 
     61class TextFile(models.Model): 
     62    description = models.CharField(max_length=20) 
     63    file = models.FileField(upload_to=tempfile.gettempdir()) 
     64 
     65    def __unicode__(self): 
     66        return self.description 
     67 
    5868__test__ = {'API_TESTS': """ 
    5969>>> from django import newforms as forms 
    6070>>> from django.newforms.models import ModelForm 
     
    701711True 
    702712>>> f.cleaned_data 
    703713{'phone': u'312-555-1212', 'description': u'Assistance'} 
     714 
     715# FileField ################################################################### 
     716 
     717>>> class TextFileForm(ModelForm): 
     718...     class Meta: 
     719...         model = TextFile 
     720 
     721Test conditions when files is either not given or empty. 
     722 
     723>>> f = TextFileForm(data={'description': u'Assistance'}) 
     724>>> f.is_valid() 
     725False 
     726>>> f = TextFileForm(data={'description': u'Assistance'}, files={}) 
     727>>> f.is_valid() 
     728False 
     729 
     730Upload a file and ensure it all works as expected. 
     731 
     732>>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test1.txt', 'content': 'hello world'}}) 
     733>>> f.is_valid() 
     734True 
     735>>> type(f.cleaned_data['file']) 
     736<class 'django.newforms.fields.UploadedFile'> 
     737>>> instance = f.save() 
     738>>> instance.file 
     739u'.../test1.txt' 
     740 
     741Edit an instance that already has the file defined in the model. This will not 
     742save the file again, but leave it exactly as it is. 
     743 
     744>>> f = TextFileForm(data={'description': u'Assistance'}, instance=instance) 
     745>>> f.is_valid() 
     746True 
     747>>> f.cleaned_data['file'] 
     748u'.../test1.txt' 
     749>>> instance = f.save() 
     750>>> instance.file 
     751u'.../test1.txt' 
     752 
     753Delete the current file since this is not done by Django. 
     754 
     755>>> os.unlink(instance.get_file_filename()) 
     756 
     757Override the file by uploading a new one. 
     758 
     759>>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test2.txt', 'content': 'hello world'}}, instance=instance) 
     760>>> f.is_valid() 
     761True 
     762>>> instance = f.save() 
     763>>> instance.file 
     764u'.../test2.txt' 
     765 
     766>>> instance.delete() 
     767 
     768Test the non-required FileField 
     769 
     770>>> f = TextFileForm(data={'description': u'Assistance'}) 
     771>>> f.fields['file'].required = False 
     772>>> f.is_valid() 
     773True 
     774>>> instance = f.save() 
     775>>> instance.file 
     776'' 
     777 
     778>>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test3.txt', 'content': 'hello world'}}, instance=instance) 
     779>>> f.is_valid() 
     780True 
     781>>> instance = f.save() 
     782>>> instance.file 
     783u'.../test3.txt'