自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
?
答案 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',
# ...
]