From cc53d9b30bd73c12413c28101d5db9f9f4df517c Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Sat, 23 Feb 2013 18:29:56 +0100 Subject: [PATCH] Fixed #15877 -- Improved exception when ModelForm has no model class Thanks theaspect at gmail.com for the report and volrath for the patch. --- django/forms/models.py | 4 ++-- tests/modeltests/model_forms/tests.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/django/forms/models.py b/django/forms/models.py index d545a074887..75d526d1736 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -233,9 +233,9 @@ class BaseModelForm(BaseForm): initial=None, error_class=ErrorList, label_suffix=':', empty_permitted=False, instance=None): opts = self._meta + if opts.model is None: + raise ValueError('ModelForm has no model class specified.') if instance is None: - if opts.model is None: - raise ValueError('ModelForm has no model class specified.') # if we didn't get an instance, instantiate a new one self.instance = opts.model() object_data = {} diff --git a/tests/modeltests/model_forms/tests.py b/tests/modeltests/model_forms/tests.py index fb400375b81..efaf2981e13 100644 --- a/tests/modeltests/model_forms/tests.py +++ b/tests/modeltests/model_forms/tests.py @@ -133,6 +133,9 @@ class ShortCategory(forms.ModelForm): slug = forms.CharField(max_length=5) url = forms.CharField(max_length=3) + class Meta: + model = Category + class ImprovedArticleForm(forms.ModelForm): class Meta: model = ImprovedArticle @@ -277,6 +280,19 @@ class ModelFormBaseTest(TestCase): ['headline', 'slug', 'pub_date', 'writer', 'article', 'categories', 'status'] ) + def test_invalid_meta_model(self): + class InvalidModelForm(forms.ModelForm): + class Meta: + pass # no model + + # Can't create new form + with self.assertRaises(ValueError): + f = InvalidModelForm() + + # Even if you provide a model instance + with self.assertRaises(ValueError): + f = InvalidModelForm(instance=Category) + def test_subcategory_form(self): class SubCategoryForm(BaseCategoryForm): """ Subclassing without specifying a Meta on the class will use