Code

Ticket #11940: modelform-callable-default.patch

File modelform-callable-default.patch, 3.1 KB (added by Harm Geerts <hgeerts@…>, 5 years ago)
  • django/db/models/fields/__init__.py

     
    313313        "Returns a django.forms.Field instance for this database Field." 
    314314        defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 
    315315        if self.has_default(): 
    316             defaults['initial'] = self.get_default() 
    317316            if callable(self.default): 
     317                defaults['initial'] = self.default 
    318318                defaults['show_hidden_initial'] = True 
     319            else: 
     320                defaults['initial'] = self.get_default() 
    319321        if self.choices: 
    320322            # Fields with choices get special treatment. 
    321323            include_blank = self.blank or not (self.has_default() or 'initial' in kwargs) 
  • django/forms/fields.py

     
    107107        messages.update(error_messages or {}) 
    108108        self.error_messages = messages 
    109109 
     110    def _get_initial(self): 
     111        if callable(self._initial): 
     112            return self._initial() 
     113        return self._initial 
     114 
     115    def _set_initial(self, value): 
     116        self._initial = value 
     117 
     118    initial = property(_get_initial, _set_initial) 
     119 
    110120    def clean(self, value): 
    111121        """ 
    112122        Validates the given value and returns its "cleaned" value as an 
  • tests/regressiontests/forms/models.py

     
    1515class BoundaryModel(models.Model): 
    1616    positive_integer = models.PositiveIntegerField(null=True, blank=True) 
    1717 
     18callable_default_value = 1 
     19def callable_default(): 
     20    global callable_default_value 
     21    callable_default_value = callable_default_value + 1 
     22    return callable_default_value 
     23 
    1824class Defaults(models.Model): 
    1925    name = models.CharField(max_length=255, default='class default value') 
    2026    def_date = models.DateField(default = datetime.date(1980, 1, 1)) 
    2127    value = models.IntegerField(default=42) 
     28    callable_default = models.IntegerField(default=callable_default) 
    2229 
    2330class ChoiceModel(models.Model): 
    2431    """For ModelChoiceField and ModelMultipleChoiceField tests.""" 
     
    8592datetime.date(1980, 1, 1) 
    8693>>> DefaultsForm().fields['value'].initial 
    879442 
     95>>> DefaultsForm().fields['callable_default'].initial != DefaultsForm().fields['callable_default'].initial 
     96True 
    8897 
    8998In a ModelForm that is passed an instance, the initial values come from the 
    9099instance's values, not the model's defaults. 
     
    102111...     name = CharField(max_length=255) 
    103112...     class Meta: 
    104113...         model = Defaults 
    105 ...         exclude = ['name'] 
     114...         exclude = ['name', 'callable_default'] 
    106115>>> f = ExcludingForm({'name': u'Hello', 'value': 99, 'def_date': datetime.date(1999, 3, 2)}) 
    107116>>> f.is_valid() 
    108117True