如何覆盖Django apps.py及其AppConfig的第三方应用程序不存在?

时间:2016-04-26 13:02:51

标签: python django

自Django 1.7以来,添加了AppConfig功能,建议将post_migrate信号放入其自定义实现的ready()部分 - https://docs.djangoproject.com/es/1.9/ref/signals/#post-migrate

文档描述的实现AppConfig的基本方法是使用__init__.py设置在default_app_config文件中指向它。文档还会建议为任何应用覆盖现有AppConfig的方法: https://docs.djangoproject.com/es/1.9/ref/applications/#for-application-users

我已经研究了一下,发现django实际上为AppConfig中的每个应用创建了INSTALLED_APPS实例,即使它没有实现自定义实现,它也会为你引导默认值。

我的问题是如何为没有实现post_migrate的应用提供带有AppConfig信号的自定义应用配置(最简单的示例是没有apps.py的第三方包)?

我知道即使对于这个应用程序,django也会创建AppConfig的默认版本,但我应该告诉它不要这样做,并使用我的自定义AppConfig而不是覆盖ready() {1}}方法实现添加post_migrate

3 个答案:

答案 0 :(得分:6)

让我们假设您希望为django crispy_forms创建自定义AppConfig(已安装到virtualenv中)。

步骤1:在项目中创建名为crispy_forms的文件夹。 第2步:在该文件夹中创建__init__.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'>

答案 1 :(得分:0)

我的问题非常相似,这里的答案帮助我找到了解决方案。我在我的Django应用程序中使用依赖于“django-constance”来管理管理站点内的一些应用程序参数。
但是我想确保一旦你使用我的webapp应用程序就会在constance中设置一些参数。

不幸的是,@canufeel提供的解决方案没有用,我可以在我的应用程序中使用constance子包,“导入错误”。

我是这样做的:

我在我的应用程序下创建了一个名为'myApp / constance'的子包,我在其中定义了@canufeel提到的相同内容。 但是改变的主要是我不再导入INSTALLED_APPS中的'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

这样做,但我认为这不是'最先进'的解决方案: - )

答案 2 :(得分:0)

我尝试了其他建议,但它们对我没有用。但是官方文件确实如此。解决方案非常简单:For application users

引用手册:

  

如果您在名为anthology的项目中使用“摇滚乐”,但您   希望它显示为“ Jazz Manouche”,您可以提供   自己的配置:

# 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',
    # ...
]