mirror of https://github.com/django/django.git
[1.5.x] Fixed #19445 -- Skip admin fieldsets validation when the ModelAdmin.get_form() method is overridden.
Backport of 0694d2196f
This commit is contained in:
parent
f28fbe7314
commit
e18bd68dbc
|
@ -6,7 +6,7 @@ from django.forms.models import (BaseModelForm, BaseModelFormSet, fields_for_mod
|
||||||
from django.contrib.admin import ListFilter, FieldListFilter
|
from django.contrib.admin import ListFilter, FieldListFilter
|
||||||
from django.contrib.admin.util import get_fields_from_path, NotRelationField
|
from django.contrib.admin.util import get_fields_from_path, NotRelationField
|
||||||
from django.contrib.admin.options import (flatten_fieldsets, BaseModelAdmin,
|
from django.contrib.admin.options import (flatten_fieldsets, BaseModelAdmin,
|
||||||
HORIZONTAL, VERTICAL)
|
ModelAdmin, HORIZONTAL, VERTICAL)
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['validate']
|
__all__ = ['validate']
|
||||||
|
@ -388,12 +388,14 @@ def check_formfield(cls, model, opts, label, field):
|
||||||
raise ImproperlyConfigured("'%s.%s' refers to field '%s' that "
|
raise ImproperlyConfigured("'%s.%s' refers to field '%s' that "
|
||||||
"is missing from the form." % (cls.__name__, label, field))
|
"is missing from the form." % (cls.__name__, label, field))
|
||||||
else:
|
else:
|
||||||
fields = fields_for_model(model)
|
get_form_is_overridden = hasattr(cls, 'get_form') and cls.get_form != ModelAdmin.get_form
|
||||||
try:
|
if not get_form_is_overridden:
|
||||||
fields[field]
|
fields = fields_for_model(model)
|
||||||
except KeyError:
|
try:
|
||||||
raise ImproperlyConfigured("'%s.%s' refers to field '%s' that "
|
fields[field]
|
||||||
"is missing from the form." % (cls.__name__, label, field))
|
except KeyError:
|
||||||
|
raise ImproperlyConfigured("'%s.%s' refers to field '%s' that "
|
||||||
|
"is missing from the form." % (cls.__name__, label, field))
|
||||||
|
|
||||||
def fetch_attr(cls, model, opts, label, field):
|
def fetch_attr(cls, model, opts, label, field):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1096,6 +1096,13 @@ templates used by the :class:`ModelAdmin` views:
|
||||||
changelist that will be linked to the change view, as described in the
|
changelist that will be linked to the change view, as described in the
|
||||||
:attr:`ModelAdmin.list_display_links` section.
|
:attr:`ModelAdmin.list_display_links` section.
|
||||||
|
|
||||||
|
.. method:: ModelAdmin.get_fieldsets(self, request, obj=None)
|
||||||
|
|
||||||
|
The ``get_fieldsets`` method is given the ``HttpRequest`` and the ``obj``
|
||||||
|
being edited (or ``None`` on an add form) and is expected to return a list
|
||||||
|
of two-tuples, in which each two-tuple represents a ``<fieldset>`` on the
|
||||||
|
admin form page, as described above in the :attr:`ModelAdmin.fieldsets` section.
|
||||||
|
|
||||||
.. method:: ModelAdmin.get_list_filter(self, request)
|
.. method:: ModelAdmin.get_list_filter(self, request)
|
||||||
|
|
||||||
.. versionadded:: 1.5
|
.. versionadded:: 1.5
|
||||||
|
|
|
@ -20,6 +20,18 @@ class InvalidFields(admin.ModelAdmin):
|
||||||
form = SongForm
|
form = SongForm
|
||||||
fields = ['spam']
|
fields = ['spam']
|
||||||
|
|
||||||
|
class ValidFormFieldsets(admin.ModelAdmin):
|
||||||
|
def get_form(self, request, obj=None, **kwargs):
|
||||||
|
class ExtraFieldForm(SongForm):
|
||||||
|
name = forms.CharField(max_length=50)
|
||||||
|
return ExtraFieldForm
|
||||||
|
|
||||||
|
fieldsets = (
|
||||||
|
(None, {
|
||||||
|
'fields': ('name',),
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
class ValidationTestCase(TestCase):
|
class ValidationTestCase(TestCase):
|
||||||
|
|
||||||
def test_readonly_and_editable(self):
|
def test_readonly_and_editable(self):
|
||||||
|
@ -42,6 +54,14 @@ class ValidationTestCase(TestCase):
|
||||||
validate,
|
validate,
|
||||||
InvalidFields, Song)
|
InvalidFields, Song)
|
||||||
|
|
||||||
|
def test_custom_get_form_with_fieldsets(self):
|
||||||
|
"""
|
||||||
|
Ensure that the fieldsets validation is skipped when the ModelAdmin.get_form() method
|
||||||
|
is overridden.
|
||||||
|
Refs #19445.
|
||||||
|
"""
|
||||||
|
validate(ValidFormFieldsets, Song)
|
||||||
|
|
||||||
def test_exclude_values(self):
|
def test_exclude_values(self):
|
||||||
"""
|
"""
|
||||||
Tests for basic validation of 'exclude' option values (#12689)
|
Tests for basic validation of 'exclude' option values (#12689)
|
||||||
|
|
Loading…
Reference in New Issue