应该如何使用Django apps.py?

时间:2017-01-27 04:40:12

标签: django

我使用的是django 1.10.5

似乎app1中的apps.py文件未导入,除非我在__init__中为该模块明确设置了default_app_config = 'app1.apps.App1Config'

然而,in the docs我正在阅读"新应用程序应避免使用default_app_config。相反,他们应该要求在INSTALLED_APPS中明确配置相应AppConfig子类的虚线路径。"

我正在阅读包含INSTALLED_APPS中的模块,如

INSTALLED_APPS = (
 '...',
 'app1',
)

我确实有。

也许我对语言"相应的AppConfig子类的#dc的虚线路径感到困惑"也许除了列出主要模块之外还有什么呢?

我的具体用途是我想导入handlers.py,因此它会包含在应用程序中,因为它有一些需要监听的信号接收器。

要做到这一点,我遵循了建议in the docs,其中说"实际上,信号处理程序通常在与其相关的应用程序的信号子模块中定义。信号接收器在应用程序配置类的ready()方法中连接。如果您正在使用receiver()装饰器,只需在ready()中导入信号子模块。"

# apps.py
from django.apps import AppConfig
class App1Config(AppConfig):
    name = 'app1'
    def ready(self):
        import app1.handlers

# handlers.py
from django.dispatch import receiver
from django.db.models.signals import post_save
from app1.models import App1

@receiver(post_save, sender=App1)
def say_you_did_something(sender, instance, **kwargs):
    print("Action has been taken.")

但这绝对没有...

直到我也添加

# __init__.py
default_app_config = 'individual.apps.IndividualConfig'

除了<之外应该避免的。 1.7

所以要用实际的术语重述这个问题,让项目了解handlers.py文件的推荐方法是什么?

2 个答案:

答案 0 :(得分:1)

你误解了这条指令。如上所述,您需要在INSTALLED_APPS中包含 AppConfig类本身的虚线路径,而不是应用程序。

INSTALLED_APPS = (
 '...',
 'app1.apps.App1Config',
)

答案 1 :(得分:1)

替换

INSTALLED_APPS = (
 '...',
 'app1,
)

使用

INSTALLED_APPS = (
 '...',
 'app1.apps.App1Config',
)

无需在 init .py

中添加default_app_config

在django 3.0应用程序文档中,提到了如何包括虚线路径。 以下是Django应用程序文档https://docs.djangoproject.com/en/3.0/ref/applications/#django.apps.AppConfig.ready的摘录:

对于应用程序作者¶ 如果您要创建一个名为“ Rock'n'roll”的可插拔应用,请按照以下步骤为管理员提供适当的名称:

# rock_n_roll/apps.py

from django.apps import AppConfig

class RockNRollConfig(AppConfig):
    name = 'rock_n_roll'
    verbose_name = "Rock ’n’ roll"

默认情况下,可以使您的应用程序加载此AppConfig子类,如下所示:

# rock_n_roll/__init__.py

default_app_config = 'rock_n_roll.apps.RockNRollConfig'

这将导致在INSTALLED_APPS包含“ rock_n_roll”时使用RockNRollConfig。这使您可以使用AppConfig功能,而无需您的用户更新其INSTALLED_APPS设置。除了这种用例之外,最好避免使用default_app_config,而应在INSTALLED_APPS中指定应用配置类,如下所述。

当然,您也可以告诉用户将“ rock_n_roll.apps.RockNRollConfig”放入其INSTALLED_APPS设置中。您甚至可以提供几种具有不同行为的AppConfig子类,并允许用户通过其INSTALLED_APPS设置选择一个。