Opened 9 years ago
Closed 9 years ago
#26816 closed Bug (fixed)
BaseModelAdminChecks._check_inlines_item may raise AttributeError
| Reported by: | Keryn Knight | Owned by: | Berker Peksag |
|---|---|---|---|
| Component: | Core (System checks) | Version: | 1.9 |
| Severity: | Normal | Keywords: | |
| Cc: | django@…, berker.peksag@… | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
given something like:
class MyInline(object): pass
class MyModelAdmin(admin.ModelAdmin):
inlines = [MyInline]
admin.E104 will be added to the error stack because its not a subclass (ugh) of BaseModelAdmin.
changing to:
class MyInline(BaseModelAdmin): pass
will throw:
AttributeError: type object 'MyInline' has no attribute 'model'
because its not until ModelAdmin or InlineModelAdmin that the attribute is set (in __init__ for ModelAdmin, as a class attribute for InlineModelAdmin)
Encountered on 1.9, but looks to be the same in master.
Change History (4)
comment:1 by , 9 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 9 years ago
comment:3 by , 9 years ago
| Cc: | added |
|---|---|
| Has patch: | set |
| Owner: | changed from to |
| Status: | new → assigned |
For future reference, here is the full traceback when BaseModelAdmin is used as a base class (see comment 2 for full example):
Unhandled exception in thread started by <function wrapper at 0x2f98668>
Traceback (most recent call last):
File "/home/berker/projects/django/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/home/berker/projects/django/django/core/management/commands/runserver.py", line 113, in inner_run
autoreload.raise_last_exception()
File "/home/berker/projects/django/django/utils/autoreload.py", line 249, in raise_last_exception
six.reraise(*_exception)
File "/home/berker/projects/django/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/home/berker/projects/django/django/__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/berker/projects/django/django/apps/registry.py", line 115, in populate
app_config.ready()
File "/home/berker/projects/django/django/contrib/admin/apps.py", line 23, in ready
self.module.autodiscover()
File "/home/berker/projects/django/django/contrib/admin/__init__.py", line 26, in autodiscover
autodiscover_modules('admin', register_to=site)
File "/home/berker/projects/django/django/utils/module_loading.py", line 50, in autodiscover_modules
import_module('%s.%s' % (app_config.name, module_to_search))
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/home/berker/projects/testdjango/core/admin.py", line 38, in <module>
site.register(SlugModel, SlugAdmin)
File "/home/berker/projects/django/django/contrib/admin/sites.py", line 110, in register
system_check_errors.extend(admin_obj.check())
File "/home/berker/projects/django/django/contrib/admin/options.py", line 117, in check
return self.checks_class().check(self, **kwargs)
File "/home/berker/projects/django/django/contrib/admin/checks.py", line 519, in check
errors.extend(self._check_inlines(admin_obj))
File "/home/berker/projects/django/django/contrib/admin/checks.py", line 557, in _check_inlines
for index, item in enumerate(obj.inlines)
File "/home/berker/projects/django/django/contrib/admin/checks.py", line 585, in _check_inlines_item
return inline(model, obj.admin_site).check()
TypeError: __init__() takes exactly 1 argument (3 given)
PR. test_not_model_admin and test_missing_model_field in tests/modeladmin/tests.py already tested the behaviors demonstrated by kezabelle.
Additional addendum:
class MyInline(BaseModelAdmin): model = MyModelwill also fail it seems, because
BaseModelAdmindoesn't have the same__init__argspec asInlineModelAdmin:I suppose the simplest fix is to check the inline is a subclass of
InlineModelAdmin.