Django apps.py应该如何使用



我使用的是django 1.10.5

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

然而,在文档中,我读到"新应用程序应该避免default_app_config。相反,它们应该要求在INSTALLED_APPS中显式配置相应的AppConfig子类的虚线路径。">

我读到的是,在INSTALLED_APPS中包含类似的模块

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

我确实有。

也许我被语言"适当的AppConfig子类的虚线路径"弄糊涂了,也许它比列出主模块更重要?

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

为此,我遵循了文档中的建议:"在实践中,信号处理程序通常定义在与其相关的应用程序的信号子模块中。信号接收器在应用程序配置类的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文件?

您误解了说明。正如它所说,您需要在INSTALLED_APPS中包含AppConfig类本身的虚线路径,而不是应用程序。

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

更换

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/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中指定应用配置类,如下所述。

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

最新更新