Python 如何为不存在的第三方应用覆盖Django apps.py及其AppConfig?
自Django 1.7以来,添加了Python 如何为不存在的第三方应用覆盖Django apps.py及其AppConfig?,python,django,Python,Django,自Django 1.7以来,添加了AppConfig功能,建议将迁移后信号放入其定制实现的ready()部分- 实现文档中描述的AppConfig的基本方法是使用default\u app\u config设置在\uuuu init\uuuuu.py文件中指向它。这些文档还建议了一种方法,可以覆盖任何应用程序的现有AppConfig: 我做了一些研究,发现django实际上为INSTALLED\u APPS中的每个app创建了AppConfig实例,即使没有实现它的自定义实现,它也会为您引导默
AppConfig
功能,建议将迁移后信号放入其定制实现的ready()
部分-
实现文档中描述的AppConfig
的基本方法是使用default\u app\u config
设置在\uuuu init\uuuuu.py
文件中指向它。这些文档还建议了一种方法,可以覆盖任何应用程序的现有AppConfig
:
我做了一些研究,发现django实际上为INSTALLED\u APPS
中的每个app创建了AppConfig
实例,即使没有实现它的自定义实现,它也会为您引导默认值
我的问题是,对于没有实现AppConfig的应用程序(最简单的例子是没有apps.py的第三方软件包),应该如何为其提供带有post_migrate
信号的定制应用程序配置
我知道,即使对于这个应用程序,django也会去创建一个默认版本的
AppConfig
,但是我应该告诉它不要这样做,在哪里以及如何使用我的自定义AppConfig
,而使用覆盖的ready()
方法实现添加迁移后的?让我们假设您希望为django crispy_表单(已安装到virtualenv中)创建自定义AppConfig
步骤1:在项目中创建名为crispy_forms的文件夹。
步骤2:在该文件夹中创建一个\uuuu init\uuuu.py
,并粘贴以下内容
from django.apps import AppConfig
default_app_config = 'crispy_forms.apps.MyAppConfig'
步骤3:在crispy_forms文件夹中创建apps.py并粘贴
from django.apps import AppConfig
class MyAppConfig(AppConfig):
verbose_name = 'customized crispy_forms'
name = "crispy_forms"
def __init__(self, app_name, app_module):
AppConfig.__init__(self,app_name, app_module)
print 'My app config', app_name, app_module
如果django没有重新加载类,请重新启动开发服务器,然后您将看到如下内容:
My app config crispy_forms <module 'crispy_forms' from '/home/xxx/project/crispy_forms/__init__.pyc'>
My app config crispy_表单
我的问题也一样,这里的答案帮助我找到了解决方案。我在Django应用程序中使用对“Django constance”的依赖项来管理管理站点内部的一些应用程序参数。
但我想确保在您使用我的webapp应用程序时,constance中的一些参数都已设置好
不幸的是,@canufeel提供的解决方案不起作用,我可以在我的应用程序“导入错误”中使用constance子包
我是这样做的:
我在我的应用程序下创建了一个名为“myApp/constance”的子包,我在其中定义了@canufeel提到的相同内容。
但主要的变化是,我不再在已安装的应用程序中导入“constance”包,而是导入“myapp.constance”,我可以在其中覆盖如下设置:
MYAPP_CONSTANCE_CONFIG_VAR = {
'ACCOUNT_ACTIVATION_DAYS': (7, 'Number of days before activation is kept available'),
'BOOTSTRAP_THEME': ('slate', 'Bootstrap theme for front end', 'select_theme'),
...
}
然后覆盖:
BASE_CONSTANCE_CONFIG = getattr(settings, 'CONSTANCE_CONFIG', {})
BASE_CONSTANCE_CONFIG.update(MYAPP_CONSTANCE_CONFIG_VAR)
settings.CONSTANCE_CONFIG = BASE_CONSTANCE_CONFIG_VAR
settings.CONSTANCE_ADDITIONAL_FIELDS = BASE_CONSTANCE_ADDITIONAL_FIELDS
settings.CONSTANCE_CONFIG_FIELDSETS = WAVES_CONSTANCE_CONFIG_FIELDSETS
这就是诀窍,但我认为这不是一个“最先进的”解决方案:-)我尝试了其他建议,但它们对我不起作用。但官方文件确实如此。解决方案非常简单:
引用手册:
如果你在一个叫做选集的项目中使用“摇滚乐”,但是你
如果希望它显示为“Jazz Manouche”,您可以提供
自身配置:
好建议!谢谢你!但在这种情况下,我开始从我的应用程序的其他部分得到错误。错误上下文基本上如下所示:来自crispy\u forms.models导入SomeModel importorror:没有名为“crispy\u forms.models”的模块
观察效果很好!在发布这篇文章之前,我并没有尝试从crispy_forms应用程序导入。如果我们保持我们的<代码> name =“CurpyPyFrame”< /Cord> Django会考虑这个新的自定义应用程序是一个CurpyPyFrame重写,然后当我们尝试从最初的代码> CurpyPyFrase插件中导入任何东西时,它会尝试从我们的应用程序中导入它。已安装的应用程序中的crispy_表单
将在我们使用相同名称时立即开始指向我们的应用程序,自定义的AppConfing
。备注:如果多个应用程序需要更新constance配置,此解决方案可能不起作用……我在项目中指出,实际上,只需要在我的应用程序中添加一个名为“myapp_constance.py”的文件,并将其包含在我的init.py中。。。完成工作,事实上相当简单:-)
# anthology/apps.py
from rock_n_roll.apps import RockNRollConfig
class JazzManoucheConfig(RockNRollConfig):
verbose_name = "Jazz Manouche"
# anthology/settings.py
INSTALLED_APPS = [
'anthology.apps.JazzManoucheConfig',
# ...
]