Skip to content

Commit

Permalink
Fixed #12674 -- provide a way to override admin validation
Browse files Browse the repository at this point in the history
Moved admin validation code to classes and have those be class
attributes to the ModelAdmin classes.
  • Loading branch information
honzakral committed May 19, 2013
1 parent 886f7cc commit 4ad1eb1
Show file tree
Hide file tree
Showing 5 changed files with 541 additions and 556 deletions.
15 changes: 15 additions & 0 deletions django/contrib/admin/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from django.contrib.admin import widgets, helpers
from django.contrib.admin.util import (unquote, flatten_fieldsets, get_deleted_objects,
model_format_dict, NestedObjects)
from django.contrib.admin import validation
from django.contrib.admin.templatetags.admin_static import static
from django.contrib import messages
from django.views.decorators.csrf import csrf_protect
Expand Down Expand Up @@ -87,6 +88,14 @@ class BaseModelAdmin(six.with_metaclass(RenameBaseModelAdminMethods)):
readonly_fields = ()
ordering = None

# validation
validator_class = validation.BaseValidator

@classmethod
def validate(cls, model):
validator = cls.validator_class()
validator.validate(cls, model)

def __init__(self):
overrides = FORMFIELD_FOR_DBFIELD_DEFAULTS.copy()
overrides.update(self.formfield_overrides)
Expand Down Expand Up @@ -371,6 +380,9 @@ class ModelAdmin(BaseModelAdmin):
actions_on_bottom = False
actions_selection_counter = True

# validation
validator_class = validation.ModelAdminValidator

def __init__(self, model, admin_site):
self.model = model
self.opts = model._meta
Expand Down Expand Up @@ -1447,6 +1459,9 @@ class InlineModelAdmin(BaseModelAdmin):
verbose_name_plural = None
can_delete = True

# validation
validator_class = validation.InlineValidator

def __init__(self, parent_model, admin_site):
self.admin_site = admin_site
self.parent_model = parent_model
Expand Down
10 changes: 2 additions & 8 deletions django/contrib/admin/sites.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,6 @@ def register(self, model_or_iterable, admin_class=None, **options):
if not admin_class:
admin_class = ModelAdmin

# Don't import the humongous validation code unless required
if admin_class and settings.DEBUG:
from django.contrib.admin.validation import validate
else:
validate = lambda model, adminclass: None

if isinstance(model_or_iterable, ModelBase):
model_or_iterable = [model_or_iterable]
for model in model_or_iterable:
Expand All @@ -94,8 +88,8 @@ def register(self, model_or_iterable, admin_class=None, **options):
options['__module__'] = __name__
admin_class = type("%sAdmin" % model.__name__, (admin_class,), options)

# Validate (which might be a no-op)
validate(admin_class, model)
if admin_class is not ModelAdmin and settings.DEBUG:
admin_class.validate(model)

# Instantiate the admin class to save in the registry
self._registry[model] = admin_class(model, self)
Expand Down
Loading

0 comments on commit 4ad1eb1

Please sign in to comment.