官术网_书友最值得收藏!

Defining overwritable app settings

This recipe will show you how to define settings for your app that can be then overwritten in your project's settings.py or local_settings.py file. This is useful especially for reusable apps.

Getting ready

Either create your Django app manually or using the following command:

(myproject_env)$ django-admin.py startapp myapp1

How to do it…

If you just have one or two settings, you can use the following pattern in your models.py file. If the settings are extensive and you want to have them organized better, create an app_settings.py file in the app and put the settings in the following way:

# models.py or app_settings.py
# -*- coding: UTF-8 -*-
from __future__ import unicode_literals
from django.conf import settings
from django.utils.translation import ugettext_lazy as _

SETTING1 = getattr(settings, "MYAPP1_SETTING1", u"default value")
MEANING_OF_LIFE = getattr(settings, "MYAPP1_MEANING_OF_LIFE", 42)
STATUS_CHOICES = getattr(settings, "MYAPP1_STATUS_CHOICES", (
    ("draft", _("Draft")),
    ("published", _("Published")),
    ("not_listed", _("Not Listed")),
))

Then, you can use the app settings in models.py, as follows:

# models.py
# -*- coding: UTF-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.utils.translation import ugettext_lazy as _

from .app_settings import STATUS_CHOICES

class NewsArticle(models.Model):
    # …
    status = models.CharField(_("Status"),
        max_length=20, choices=STATUS_CHOICES
    )

If you want to overwrite the STATUS_CHOICES setting for just one project, you simply open settings.py and add the following:

# settings.py
# …
from django.utils.translation import ugettext_lazy as _
MYAPP1_STATUS_CHOICES = (
    ("imported", _("Imported")),
    ("draft", _("Draft")),
    ("published", _("Published")),
    ("not_listed", _("Not Listed")),
    ("expired", _("Expired")),
)

How it works…

The getattr(object, attribute_name[, default_value]) Python function tries to get the attribute_name attribute from object and returns default_value if it is not found. In this case, different settings are tried in order to be taken from the Django project settings module, and if they are not found, the default values are assigned.

主站蜘蛛池模板: 扎鲁特旗| 北海市| 辉南县| 土默特左旗| 平湖市| 新龙县| 安庆市| 青神县| 靖远县| 鄱阳县| 惠州市| 浪卡子县| 乌兰浩特市| 陆丰市| 龙门县| 普陀区| 松原市| 濉溪县| 榆树市| 香港| 三台县| 陇西县| 房产| 马公市| 自贡市| 安龙县| 阿坝县| 克什克腾旗| 隆德县| 广汉市| 台南县| 东莞市| 福鼎市| 杂多县| 浮梁县| 翁源县| 奎屯市| 五河县| 册亨县| 陇南市| 肃北|