簡體   English   中英

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

[英]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文件中指向它。 文檔還會建議一種方法來覆蓋任何應用程序的現有AppConfighttps : //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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM