Proposed fix for #18162.
This commit is contained in:
parent
f3ae67a62f
commit
b6f4a92ff4
|
@ -467,7 +467,7 @@ class Field(object):
|
||||||
def save_form_data(self, instance, data):
|
def save_form_data(self, instance, data):
|
||||||
setattr(instance, self.name, data)
|
setattr(instance, self.name, data)
|
||||||
|
|
||||||
def formfield(self, form_class=forms.CharField, **kwargs):
|
def formfield(self, form_class=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Returns a django.forms.Field instance for this database Field.
|
Returns a django.forms.Field instance for this database Field.
|
||||||
"""
|
"""
|
||||||
|
@ -488,7 +488,8 @@ class Field(object):
|
||||||
defaults['coerce'] = self.to_python
|
defaults['coerce'] = self.to_python
|
||||||
if self.null:
|
if self.null:
|
||||||
defaults['empty_value'] = None
|
defaults['empty_value'] = None
|
||||||
form_class = forms.TypedChoiceField
|
if form_class is None or not issubclass(form_class, forms.TypedChoiceField):
|
||||||
|
form_class = forms.TypedChoiceField
|
||||||
# Many of the subclass-specific formfield arguments (min_value,
|
# Many of the subclass-specific formfield arguments (min_value,
|
||||||
# max_value) don't apply for choice fields, so be sure to only pass
|
# max_value) don't apply for choice fields, so be sure to only pass
|
||||||
# the values that TypedChoiceField will understand.
|
# the values that TypedChoiceField will understand.
|
||||||
|
@ -498,6 +499,8 @@ class Field(object):
|
||||||
'error_messages', 'show_hidden_initial'):
|
'error_messages', 'show_hidden_initial'):
|
||||||
del kwargs[k]
|
del kwargs[k]
|
||||||
defaults.update(kwargs)
|
defaults.update(kwargs)
|
||||||
|
if form_class is None:
|
||||||
|
form_class = forms.CharField
|
||||||
return form_class(**defaults)
|
return form_class(**defaults)
|
||||||
|
|
||||||
def value_from_object(self, obj):
|
def value_from_object(self, obj):
|
||||||
|
|
|
@ -73,6 +73,16 @@ class BasicFieldTests(test.TestCase):
|
||||||
|
|
||||||
self.assertEqual(m._meta.get_field('id').verbose_name, 'verbose pk')
|
self.assertEqual(m._meta.get_field('id').verbose_name, 'verbose pk')
|
||||||
|
|
||||||
|
def test_formclass_with_choices(self):
|
||||||
|
# regression for 18162
|
||||||
|
class CustomChoiceField(forms.TypedChoiceField):
|
||||||
|
pass
|
||||||
|
choices = [('a@b.cc', 'a@b.cc'), ('b@b.cc', 'b@b.cc')]
|
||||||
|
field = models.CharField(choices=choices)
|
||||||
|
klass = CustomChoiceField
|
||||||
|
self.assertIsInstance(field.formfield(form_class=klass), klass)
|
||||||
|
|
||||||
|
|
||||||
class DecimalFieldTests(test.TestCase):
|
class DecimalFieldTests(test.TestCase):
|
||||||
def test_to_python(self):
|
def test_to_python(self):
|
||||||
f = models.DecimalField(max_digits=4, decimal_places=2)
|
f = models.DecimalField(max_digits=4, decimal_places=2)
|
||||||
|
|
Loading…
Reference in New Issue