summaryrefslogtreecommitdiff
path: root/tests/regressiontests
diff options
context:
space:
mode:
authorJustin Bronn <jbronn@gmail.com>2010-09-10 22:46:22 +0000
committerJustin Bronn <jbronn@gmail.com>2010-09-10 22:46:22 +0000
commitfd1e4b81d9fb58010166135622c9be415c3b1e31 (patch)
treec6a5da92c63328f6da9c6acb7fc1a79299c9dc15 /tests/regressiontests
parentc5772009c12f477f062fae4bde7d5f0a51627ed4 (diff)
Fixed #13095 -- `formfield_callback` keyword argument is now more sane and works with widgets defined in `ModelForm.Meta.widgets`. Thanks, hvdklauw for bug report, vung for initial patch, and carljm for review.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@13730 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests/regressiontests')
-rw-r--r--tests/regressiontests/model_forms_regress/tests.py44
-rw-r--r--tests/regressiontests/model_formsets_regress/tests.py62
2 files changed, 105 insertions, 1 deletions
diff --git a/tests/regressiontests/model_forms_regress/tests.py b/tests/regressiontests/model_forms_regress/tests.py
index 5bee73ce7e..569be2a231 100644
--- a/tests/regressiontests/model_forms_regress/tests.py
+++ b/tests/regressiontests/model_forms_regress/tests.py
@@ -250,3 +250,47 @@ class URLFieldTests(TestCase):
form.is_valid()
# self.assertTrue(form.is_valid())
# self.assertEquals(form.cleaned_data['url'], 'http://example.com/test')
+
+
+class FormFieldCallbackTests(TestCase):
+
+ def test_baseform_with_widgets_in_meta(self):
+ """Regression for #13095: Using base forms with widgets defined in Meta should not raise errors."""
+ widget = forms.Textarea()
+
+ class BaseForm(forms.ModelForm):
+ class Meta:
+ model = Person
+ widgets = {'name': widget}
+
+ Form = modelform_factory(Person, form=BaseForm)
+ self.assertTrue(Form.base_fields['name'].widget is widget)
+
+ def test_custom_callback(self):
+ """Test that a custom formfield_callback is used if provided"""
+
+ callback_args = []
+
+ def callback(db_field, **kwargs):
+ callback_args.append((db_field, kwargs))
+ return db_field.formfield(**kwargs)
+
+ widget = forms.Textarea()
+
+ class BaseForm(forms.ModelForm):
+ class Meta:
+ model = Person
+ widgets = {'name': widget}
+
+ _ = modelform_factory(Person, form=BaseForm,
+ formfield_callback=callback)
+ id_field, name_field = Person._meta.fields
+
+ self.assertEqual(callback_args,
+ [(id_field, {}), (name_field, {'widget': widget})])
+
+ def test_bad_callback(self):
+ # A bad callback provided by user still gives an error
+ self.assertRaises(TypeError, modelform_factory, Person,
+ formfield_callback='not a function or callable')
+
diff --git a/tests/regressiontests/model_formsets_regress/tests.py b/tests/regressiontests/model_formsets_regress/tests.py
index 61bc514324..ee2a26f6c2 100644
--- a/tests/regressiontests/model_formsets_regress/tests.py
+++ b/tests/regressiontests/model_formsets_regress/tests.py
@@ -1,8 +1,10 @@
-from django.forms.models import modelform_factory, inlineformset_factory
+from django import forms
+from django.forms.models import modelform_factory, inlineformset_factory, modelformset_factory
from django.test import TestCase
from models import User, UserSite, Restaurant, Manager
+
class InlineFormsetTests(TestCase):
def test_formset_over_to_field(self):
"A formset over a ForeignKey with a to_field can be saved. Regression for #10243"
@@ -156,3 +158,61 @@ class InlineFormsetTests(TestCase):
# you can create a formset with an instance of None
form = Form(instance=None)
formset = FormSet(instance=None)
+
+
+class CustomWidget(forms.CharField):
+ pass
+
+
+class UserSiteForm(forms.ModelForm):
+ class Meta:
+ model = UserSite
+ widgets = {'data': CustomWidget}
+
+
+class Callback(object):
+
+ def __init__(self):
+ self.log = []
+
+ def __call__(self, db_field, **kwargs):
+ self.log.append((db_field, kwargs))
+ return db_field.formfield(**kwargs)
+
+
+class FormfieldCallbackTests(TestCase):
+ """
+ Regression for #13095: Using base forms with widgets
+ defined in Meta should not raise errors.
+ """
+
+ def test_inlineformset_factory_default(self):
+ Formset = inlineformset_factory(User, UserSite, form=UserSiteForm)
+ form = Formset({}).forms[0]
+ self.assertTrue(isinstance(form['data'].field.widget, CustomWidget))
+
+ def test_modelformset_factory_default(self):
+ Formset = modelformset_factory(UserSite, form=UserSiteForm)
+ form = Formset({}).forms[0]
+ self.assertTrue(isinstance(form['data'].field.widget, CustomWidget))
+
+ def assertCallbackCalled(self, callback):
+ id_field, user_field, data_field = UserSite._meta.fields
+ expected_log = [
+ (id_field, {}),
+ (user_field, {}),
+ (data_field, {'widget': CustomWidget}),
+ ]
+ self.assertEqual(callback.log, expected_log)
+
+ def test_inlineformset_custom_callback(self):
+ callback = Callback()
+ inlineformset_factory(User, UserSite, form=UserSiteForm,
+ formfield_callback=callback)
+ self.assertCallbackCalled(callback)
+
+ def test_modelformset_custom_callback(self):
+ callback = Callback()
+ modelformset_factory(UserSite, form=UserSiteForm,
+ formfield_callback=callback)
+ self.assertCallbackCalled(callback)