[英]How to override Django apps.py and its AppConfig for third-party apps which is not there?
自 Django 1.7 以來,已添加AppConfig
功能,建議將 post_migrate 信號放入其自定義實現的ready()
部分 - https://docs.djangoproject.com/en/stable/ref/signals/#post-migrate
實現文檔描述的AppConfig
的基本方法是使用default_app_config
設置在__init__.py
文件中指向它。 文檔還會建議一種方法來覆蓋任何應用程序的現有AppConfig
: https : //docs.djangoproject.com/en/stable/ref/applications/#for-application-users
我研究了一下,發現 django 實際上為INSTALLED_APPS
每個應用程序創建了AppConfig
實例,即使它的自定義實現沒有實現,它也會為你引導默認設置。
我的問題是如何為未實現AppConfig
的應用程序提供帶有post_migrate
信號的自定義應用程序配置(最簡單的示例是沒有 apps.py 的第三方包)?
我知道即使對於這個應用程序,django 也會去創建AppConfig
的默認版本,但是我應該在哪里以及如何告訴它不要這樣做,而是使用我的自定義AppConfig
代替覆蓋的ready()
方法實現來添加post_migrate
?
讓我們暫時假設您希望為 django 脆皮表單(您已安裝到您的 virtualenv 中)創建一個自定義 AppConfig。
第 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'>
我的問題完全相同,這里的回答幫助我找到了解決方案。 我在我的 Django 應用程序中使用對“django-constance”的依賴來管理管理站點內的一些應用程序參數。
但是我想確保在您使用我的 webapp 應用程序后立即設置了一些參數。
不幸的是,@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
這確實有用,但我仍然認為這不是“最先進的”解決方案:-)
我嘗試了其他建議,但它們對我不起作用。 但是官方文檔做到了。 解決方案很簡單: 對於應用程序用戶
引用手冊:
如果您在名為 anthology 的項目中使用“Rock 'n'roll”,但您希望它顯示為“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',
# ...
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.