Opened 3 years ago

Last modified 3 years ago

#32692 closed Bug

Django 3.2 automatic AppConfig discovery breaks projects working in 3.1.8 — at Version 1

Reported by: Manel Clos Owned by: nobody
Component: contrib.admin Version: 3.2
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Manel Clos)

The described method of overriding the default admin site (https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#overriding-the-default-admin-site), is not compatible with automatic AppConfig discovery, if the app (myproject, or myapps) is already in INSTALLED_APPS.

How to reproduce

  • pip install Django==3.2
  • django-admin startproject myproject
  • python manage.py migrate
  • python manage.py createsuperuser
  • Put a template in myproject/templates/admin/base_site.html
    {% extends 'admin/base_site.html' %}
    
    {% block branding %}
    Template test
    {% endblock %}
    
  • Add myproject to INSTALLED_APPS
    INSTALLED_APPS = [
        'myproject',
    
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
  • python manage.py runserver works, I can access the admin site and see the changes in templates
  • Follow the guide to override the default admin site, https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#overriding-the-default-admin-site, this is, create myproject/admin.py, myproject/apps.py and modify settings.py.
    # myproject/admin.py
    from django.contrib import admin
    
    class MyAdminSite(admin.AdminSite):
        index_title = 'Test'
    
    
    # myproject/apps.py
    from django.contrib.admin.apps import AdminConfig
    
    class MyAdminConfig(AdminConfig):
        default_site = 'myproject.admin.MyAdminSite'
    
    
    # myproject/settings.py
    INSTALLED_APPS = [
        'myproject',
    
        'myproject.apps.MyAdminConfig',  # 'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
  • python manage.py runserver

Actual result
RuntimeError: 'myproject.apps' declares more than one default AppConfig: 'AdminConfig', 'MyAdminConfig'.`

This a regression

  • pip install Django==3.1.8
  • python manage.py runserver
  • All ok, both templates and AdminConfig working at the same time

Workaroud

  • use app-admin.py instead of apps.py when following the documentation to override the default admin site
    from django.contrib.admin.apps import AdminConfig
    
    class MyAdminConfig(AdminConfig):
        default_site = 'myproject.admin.MyAdminSite'
    
  • adjust settings.py: 'myproject.apps-admin.MyAdminConfig' in INSTALLED_APPS
    INSTALLED_APPS = [
        'myproject',
    
        'myproject.apps-admin.MyAdminConfig',  # 'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
  • works with Django 3.2 now!

Change History (1)

comment:1 by Manel Clos, 3 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top