覆盖AppConfig.ready()

Mic*_*ael 54 django

试图抓住Django的基础知识.即应用程序如何工作.文档:https://docs.djangoproject.com/en/stable/ref/applications/#methods

在AppConfig类的代码中我们可以读到:

def ready(self):
    """
    Override this method in subclasses to run code when Django starts.
    """
Run Code Online (Sandbox Code Playgroud)

嗯,这是我的例子:

my_app应用/ apps.py

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        print('My app')
Run Code Online (Sandbox Code Playgroud)

我只想让ready方法工作.也就是说,当Django找到my_app时,让它运行ready方法.

该应用程序已在INSTALLED_APPS中注册.

我执行'python manage.py runserver'.什么都没打印出来.

如果我在ready方法中放置一个断点,那么调试器就不会停在那里.

你能帮助我吗:我在这里理解的错误是什么?先感谢您.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'my_app',
]
Run Code Online (Sandbox Code Playgroud)

我创建了一个视图

my_app应用/ views.py

def index(request):
    print('Print index')
Run Code Online (Sandbox Code Playgroud)

urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', my_app_views.index, name='home')
]
Run Code Online (Sandbox Code Playgroud)

嗯,这个观点很有效.这意味着该应用程序已注册.

sol*_*oke 106

你需要做两件事之一.要么明确说出AppConfig你想要的INSTALLED_APPS:

INSTALLED_APPS = [
    'my_app.apps.MyAppConfig'
]
Run Code Online (Sandbox Code Playgroud)

或者,default_app_config__init__.py您的应用中定义一个:

# my_app/__init__.py
default_app_config = 'my_app.apps.MyAppConfig'
Run Code Online (Sandbox Code Playgroud)

(并保持INSTALLED_APPS原样).

因为它目前是Django找不到任何AppConfig应用程序,只是假设没有.所以你的观点等会起作用,但这种ready()方法永远不会被调用.

这是文档相关部分.

  • 它给我django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。错误 (2认同)