Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为不存在的第三方应用覆盖Django apps.py及其AppConfig?_Python_Django - Fatal编程技术网

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

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实例,即使没有实现它的自定义实现,它也会为您引导默

自Django 1.7以来,添加了
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',
    # ...
]