Django Custom AppConfig ломает проект - PullRequest
0 голосов
/ 07 октября 2019

У меня есть демонстрационный проект Django, созданный с помощью Django 2.2. Структура выглядит следующим образом:

my_project/
├── db.sqlite3
├── my_app
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── models.py
│   ├── urls.py
│   └── views.py
├── manage.py
├── my_project
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── requirements.txt

Это началось с крошечной проблемы: «my_app» отображался в админке Django как «MY_APP» (с подчеркиванием). В Django docs говорится, что вы можете сделать это красивее, определив пользовательскую конфигурацию приложения, которая подклассов "django.apps.AppConfig", и что обычно этот подкласс будет определен в (на моем примере) "my_app / apps.py». Фактически, использование manage.py startapp my_app даже генерирует это для вас:

# my_app/apps.py
from django.apps import AppConfig


class MyAppConfig(AppConfig):
    name = 'my_app'

В документах также сказано «поставить пунктирный путь к этому подклассу в INSTALLED_APPS». Другой подход состоит в том, чтобы установить переменную default_app_config в вашем приложении "__init__.py", но "Новые приложения должны избегать default_app_config. Вместо этого они должны требовать, чтобы точечный путь к соответствующему подклассу AppConfig был явно настроен в INSTALLED_APPS."

Однако, если я добавлю путь к конфигурации пользовательского приложения в INSTALLED_APPS следующим образом:

# settings.py
...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'my_app',
    'my_app.apps.MyAppConfig'                                                                                                                                                                            
]
...

, проект сразу завершится с ошибкой «LookupError: Нет установленного приложения с меткой« admin ». "

Ошибка восходит к ссылке на admin.site.urls в корне проекта" urls.py "(строка 6 ниже):

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('my_app/', include('my_app.urls', namespace='my_app'))
]

В заключение добавляем путь кМодуль "apps", созданный "startapp" - даже без внесения каких-либо изменений в этот модуль - вылетает из проекта. OTOH, если я пойду против совета документации и определю default_app_config в "my_app / init .py", , что работает.

Это кажется очень простым,но поиск в Google это ничего не дает, что обычно означает, что я делаю фундаментальную ошибку, которую не осознаю. Любые идеи, кто-нибудь?

...