2016-06-28 4 views
16

この質問は以前に頼まれました:What is the purpose of apps.py in Django 1.9?Djangoのapps.pyの目的は何ですか?

アプリケーション設定は、アプリケーションのためのメタデータを格納するオブジェクト。いくつかの属性は、AppConfigサブクラスで設定できます。その他はDjangoと読み取り専用で設定されます。

ただし、アプリケーションのメタデータとはどういう意味ですか?それはAppConfig metadata:name, verbose_name, path, label, module, models_moduleに限定されていますか?

それとも我々は日付の書式設定を持っているblogアプリを、次のように普通に定義では、たとえば、特にアプリケーション固有のメタデータのために、事前に定義されたメタデータをbeyondsそれが拡張しても意味がない:

# File: settings.py 
BLOG = { 
    'DATE_FORMAT': 'ddMMYYY', 
} 

# File: blog/<...>.py 
from django.conf import settings 
date_format = settings.BLOG['DATE_FORMAT'] 

逆に、我々はこの設定を移動することができます:それは次のように使用されています猶予期間blog/apps.pyBlogConfig

class BlogConfig(AppConfig): 
    name = 'blog' 
    verbose_name = 'Awesome Blog' 
    date_format = 'ddMMYYYY' 

ので、アプリケーションのコードを通じて、date_formatはで使用されていること:

# File: blog/<...>.py 
from django.apps import apps 
date_format = apps.get_app_config('blog').date_format 

それはsettings.pyプロジェクト設定ではなく、アプリケーションの設定ように私には聞こえます。したがって、すべてのアプリケーション設定をapps.pyの中に入れた方が、より多くの音が聞こえます。settings.py。だから、settings.pyではなく、apps.pyの内部にアプリケーション構成を入れるための有効な仮定/引数/規則ですか?

答えて

3

プロジェクトはdjangoインストールごとにユニークですが、アプリケーションは再利用可能と思われます。

あなたのプロジェクトのsettings.pyにカスタムアプリケーションの設定を入れた場合、特にあなた(または他のユーザー)がこのアプリケーションを別のプロジェクトに再利用している場合は、変更可能と思われます。

ここで、これらのカスタム設定をアプリのapps.pyに入れると、プロジェクトごとに変更できないことになります。この場合、例えばconstantsサブモジュールではなく、apps.pyに入れる理由はありません。あなたは可能性のconfigsの限定セットを提供する場合を除き:

class BlogConfig(AppConfig): 
    name = 'blog' 
    verbose_name = "Blog" 
    date_format = 'ddMMYYYY' 


class CustomizableDateFormatBlogConfig(BlogConfig): 
    date_format = getattr(settings, 'BLOG_DATE_FORMAT', BlogConfig.date_format) 


class I18nBlogConfig(BlogConfig) 
    verbose_name = _("Blog") 

default_app_configBlogConfigだろうが、アプリを使用して、プロジェクトはCustomizableDateFormatBlogConfigまたはI18nBlogConfigを同様に選択することができるであろう。

しかし、これはカスタマイズが非常に難しいアプリです。アプリのユーザーがCustomizableDateFormatBlogConfigI18nBlogConfigの両方を使用できるようにしたい場合は、上記の例では、あなたはこのような何かする必要があるでしょう:だから

class BlogConfig(AppConfig): 
    name = 'blog' 
    verbose_name = "Blog" 
    date_format = 'ddMMYYYY' 


class CustomizableDateFormatMixin: 
    date_format = getattr(settings, 'BLOG_DATE_FORMAT', BlogConfig.date_format) 


class I18nMixin: 
    verbose_name = _("Blog") 


class CustomizableDateFormatBlogConfig(CustomizableDateFormatMixin, BlogConfig): 
    pass 


class I18nBlogConfig(I18nMixin, BlogConfig): 
    pass 


class I18nCustomizableDateFormatBlogConfig(I18nMixin, CustomizableDateFormatMixin, BlogConfig): 
    pass 

をあなたはいくつかの異なるセットを提供する必要があり、離れて、特定の例アプリの設定では、カスタムアプリの設定をプロジェクトのsettings.pyに入れてください。

関連する問題