diff --git a/django/views/generic/edit.py b/django/views/generic/edit.py index 4bcef9cb6a..e88dd82958 100644 --- a/django/views/generic/edit.py +++ b/django/views/generic/edit.py @@ -121,6 +121,10 @@ class ModelFormMixin(FormMixin, SingleObjectMixin): """ Returns the form class to use in this view. """ + if self.fields is not None and self.form_class: + raise ImproperlyConfigured( + "Specifying both 'fields' and 'form_class' is not permitted." + ) if self.form_class: return self.form_class else: diff --git a/docs/ref/class-based-views/mixins-editing.txt b/docs/ref/class-based-views/mixins-editing.txt index 1a06e2bb97..3dcf28dae3 100644 --- a/docs/ref/class-based-views/mixins-editing.txt +++ b/docs/ref/class-based-views/mixins-editing.txt @@ -115,6 +115,17 @@ ModelFormMixin :attr:`~django.views.generic.detail.SingleObjectMixin.queryset` attributes, describing the type of object that the ``ModelForm`` is manipulating. + If you specify both the + :attr:`~django.views.generic.edit.ModelFormMixin.fields` and + :attr:`~django.views.generic.edit.FormMixin.form_class` attributes, an + :exc:`~django.core.exceptions.ImproperlyConfigured` exception will be + raised. + + .. versionchanged:: 1.8 + + Previously if both ``fields`` and ``form_class`` were specified, + ``fields`` was silently ignored. + **Mixins** * :class:`django.views.generic.edit.FormMixin` diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt index 41a0be4ecc..3175eecf5f 100644 --- a/docs/releases/1.8.txt +++ b/docs/releases/1.8.txt @@ -783,6 +783,11 @@ Miscellaneous ````). This won't change the behavior of the :class:`~django.views.debug.SafeExceptionReporterFilter` class. +* Class-based views that use :class:`~django.views.generic.edit.ModelFormMixin` + will raise an :exc:`~django.core.exceptions.ImproperlyConfigured` exception + when both the ``fields`` and ``form_class`` attributes are specified. + Previously, ``fields`` was silently ignored. + .. _deprecated-features-1.8: Features deprecated in 1.8 diff --git a/docs/topics/class-based-views/generic-editing.txt b/docs/topics/class-based-views/generic-editing.txt index 8490f0d4fb..be087d7758 100644 --- a/docs/topics/class-based-views/generic-editing.txt +++ b/docs/topics/class-based-views/generic-editing.txt @@ -139,11 +139,20 @@ inner ``Meta`` class on :class:`~django.forms.ModelForm`. Unless you define the form class in another way, the attribute is required and the view will raise an :exc:`~django.core.exceptions.ImproperlyConfigured` exception if it's not. +If you specify both the :attr:`~django.views.generic.edit.ModelFormMixin.fields` +and :attr:`~django.views.generic.edit.FormMixin.form_class` attributes, an +:exc:`~django.core.exceptions.ImproperlyConfigured` exception will be raised. + .. versionchanged:: 1.8 Omitting the ``fields`` attribute was previously allowed and resulted in a form with all of the model's fields. +.. versionchanged:: 1.8 + + Previously if both ``fields`` and ``form_class`` were specified, + ``fields`` was silently ignored. + Finally, we hook these new views into the URLconf: .. snippet:: diff --git a/tests/generic_views/test_edit.py b/tests/generic_views/test_edit.py index 51f4ac6104..bd48aef11b 100644 --- a/tests/generic_views/test_edit.py +++ b/tests/generic_views/test_edit.py @@ -14,6 +14,7 @@ from django.views.generic.edit import FormMixin, ModelFormMixin, CreateView from . import views from .models import Artist, Author +from .test_forms import AuthorForm class FormMixinTests(TestCase): @@ -206,6 +207,16 @@ class CreateViewTests(TestCase): with self.assertRaisesMessage(ImproperlyConfigured, message): MyCreateView().get_form_class() + def test_define_both_fields_and_form_class(self): + class MyCreateView(CreateView): + model = Author + form_class = AuthorForm + fields = ['name'] + + message = "Specifying both 'fields' and 'form_class' is not permitted." + with self.assertRaisesMessage(ImproperlyConfigured, message): + MyCreateView().get_form_class() + @override_settings(ROOT_URLCONF='generic_views.urls') class UpdateViewTests(TestCase):