यहाँ दो समाधान कर रहे हैं। दोनों के लिए आप अपने अनुप्रयोगों में 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 में घोषित करते हैं, तो आप यह सुनिश्चित नहीं कर सकते कि कौन सा डिफ़ॉल्ट मान आपके द्वारा पूछा जाएगा।
क्या यह नाजुक नहीं है? 'App_settings.py' से पहले प्रोजेक्ट' सेटिंग्स.py' आयात किए जा रहे हैं? – Flimm