覆盖AppConfig.ready()

时间:2016-05-25 06:48:36

标签: 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.
    """

嗯,这是我的榜样:

程序my_app / apps.py

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        print('My app')

我只想让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',
]

我创建了一个视图

程序my_app / views.py

def index(request):
    print('Print index')

urls.py

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

嗯,这个观点正在发挥作用。这意味着该应用程序已注册。

1 个答案:

答案 0 :(得分:86)

你需要做两件事之一。在AppConfig中明确说出您想要的INSTALLED_APPS

INSTALLED_APPS = [
    'my_app.apps.MyAppConfig'
]

或者,在应用的default_app_config中定义__init__.py

# my_app/__init__.py
default_app_config = 'my_app.apps.MyAppConfig'

(并按原样离开INSTALLED_APPS。)

因为目前Django找不到应用程序的任何AppConfig,只是假设没有。因此,您的观点等将起作用,但ready()方法永远不会被调用。

这是relevant section of the documentation