如何为自定义Django设置定义默认值

Django文档提到您可以将自己的设置添加到
django.conf.settings
。所以,如果我的项目是
settings.py
定义的
APPLES = 1
我可以在该项目的应用程序中使用
settings.APPLES
访问它。 但是如果我的
settings.py
没有定义该值,那么访问
settings.APPLES
显然是行不通的。有没有办法定义
APPLES
的默认值,如果
settings.py
中没有明确的设置,则使用该默认值? 我最好在模块/包中定义需要设置的默认值。     
已邀请:
在我的应用程序中,我有一个单独的settings.py文件。在该文件中,我有一个get()函数,它在项目的settings.py文件中查找,如果没有找到则返回默认值。
from django.conf import settings

def get(key, default):
    return getattr(settings, key, default)


APPLES = get('APPLES', 1)
然后我需要访问APPLES我有:
from myapp import settings as myapp_settings

myapp_settings.APPLES
这允许在项目settings.py中覆盖,getattr将首先检查那里并在找到属性时返回值,或使用应用程序设置文件中定义的默认值。     
怎么样:
getattr(app_settings, 'SOME_SETTING', 'default value')
    
这是两个解决方案。对于这两种文件,您可以在应用程序中设置
settings.py
文件并使用默认值填充它们。 配置单个应用程序的默认值 在代码中使用
from MYAPP import settings
而不是
from django.conf import settings
。 编辑
YOURAPP/__init__.py
from django.conf import settings as user_settings
from . import settings as default_settings

class AppSettings:
    def __getattr__(self, name):
        # If the setting you want is filled by the user, let's use it.
        if hasattr(user_settings, name):
            return getattr(user_settings, name)

        # If the setting you want has a default value, let's use it.
        if hasattr(default_settings, name):
            return getattr(default_settings, name)

        raise AttributeError("'Settings' object has no attribute '%s'" % name)

settings = AppSettings()
配置整个项目的默认值 在代码中使用
from MYPROJECT import settings
而不是
from django.conf import settings
。 编辑
MYPROJECT/MYPROJECT/__init__.py
import os, sys, importlib
from . import settings as user_settings

def get_local_apps():
    """Returns the locally installed apps names"""
    apps = []
    for app in user_settings.INSTALLED_APPS:
        path = os.path.join(user_settings.BASE_DIR, app)
        if os.path.exists(path) and app != __name__:
            apps.append(sys.modules[app])
    return apps

class AppSettings:
    SETTINGS_MODULE = 'settings'

    def __getattr__(self, setting_name):

        # If the setting you want is filled by the user, let's use it.
        if hasattr(user_settings, setting_name):
            return getattr(user_settings, setting_name)

        # Let's check every local app loaded by django.
        for app in get_local_apps():
            module_source = os.path.join(app.__path__[0], "%s.py" % self.SETTINGS_MODULE)
            module_binary = os.path.join(app.__path__[0], "%s.pyc" % self.SETTINGS_MODULE)
            if os.path.exists(module_source) or os.path.exists(module_binary):
                module = importlib.import_module("%s.%s" % (app.__name__, self.SETTINGS_MODULE))

                # Let's take the first default value for this setting we can find in any app
                if hasattr(module, setting_name):
                    return getattr(module, setting_name)

        raise AttributeError("'Settings' object has no attribute '%s'" % setting_name)

settings = AppSettings()
此解决方案似乎更容易安装,但它不保证将返回良好的默认值。如果多个应用程序在settings.py中声明了相同的变量,则无法确定哪个应用程序将返回您询问的默认值。     
从Mike的回答开始,我现在将默认设置处理包装到一个易于使用的界面中。 助手模块:
from django.conf import settings

class SettingsView(object):
   class Defaults(object):
      pass

   def __init__(self):
      self.defaults = SettingsView.Defaults()

   def __getattr__(self, name):
      return getattr(settings, name, getattr(self.defaults, name))
用法:
from localconf import SettingsView

settings = SettingsView()
settings.defaults.APPLES = 1

print settings.APPLES
这将打印
django.conf.settings
的值,如果未在此处设置,则打印默认值。此
settings
对象也可用于访问所有标准设置值。     
我最近有同样的问题,并创建了一个Django应用程序,旨在用于这种情况。它允许您为某些设置定义默认值。然后,它首先检查是否在全局设置文件中设置了该设置。如果没有,它将返回默认值。 我已将它扩展为允许某些类型检查或预处理默认值(例如,加载时可以将点类路径转换为类本身) 该应用程序可在以下网址找到:https://pypi.python.org/pypi?name = Django-pluggableappsettings& version = 0.2.0&:action = display     

要回复问题请先登录注册