2016-06-28 366 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

或者它是有意義的延伸beyonds的預定元數據,特別是對於特定應用的元數據,例如,在blog應用我們有一個日期格式配置,通常定義如下:

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

在哪個它被用作如下:

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

相反地,我們可以將這個配置blog/apps.py作爲BlogConfig

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內的聲音更多。那麼,對於我來說,這是一個有效的假設/參數/約定,將應用程序配置放入apps.py而不是settings.py

回答

3

每個django安裝項目都是唯一的,而應用程序應該是可重用的。

如果您將自定義應用程序設置放在您項目的settings.py中,那麼它們應該是可修改的,特別是如果您(或其他人)將此應用程序重用於其他項目。

現在,如果你把這些自定義設置你的應用程序的apps.py,這意味着他們不會修改對每個項目的基礎。在這種情況下,沒有理由將它們放入apps.py而不是放在constants子模塊中。除非你想提供一組有限的可能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但使用的應用程序,該項目將能夠選擇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 

因此,除了特定的情況:在上面的例子,如果你想要讓應用的用戶同時使用CustomizableDateFormatBlogConfigI18nBlogConfig,你需要做這樣的事情應用程序配置,你最好把你的自定義應用程序設置在項目的settings.py