2
2

More than 3 years have passed since last update.

【Django】settings.pyに書くような設定をモデルで管理する

Last updated at Posted at 2019-12-25

webアプリケーション全体で利用するような設定は、settings.pyで行うのが一般的です。

しかし、設定を頻繁に変更する場合や、クライアントが簡単に変更できるようにしたい場合には、admin管理サイトで変更できると便利です。

方法

ステップ1

settings.pyに以下を追加します

settings.py
INSTALLED_APPS = [
    ~~~~~
    'django.contrib.sites',  #追加
]
SITE_ID = 1  #追加

ステップ2

models.pyに以下を追加します。

models.py
from django.contrib.sites.models import Site

class SiteDetail(models.Model):
    site = models.OneToOneField(Site, verbose_name='Site', on_delete=models.PROTECT)
    #以下は設定した項目追加の例
    DEFAULT_FROM_EMAIL = models.CharField('DEFAULT_FROM_EMAIL', max_length=255, blank=True)

Djangoに付属するsitesフレームワークを導入すると、1つのウェブサイトに1つのSiteデータが割り当てられます。これとOneToOneで紐づくSiteDetailのようなモデルを作ることで、そのウェブサイト全体の設定を表すモデルが作れるらしいです。

ステップ3

以下を追加

apps.py
from django.apps import AppConfig
from django.db.models.signals import post_migrate


class AppConfig(AppConfig):
    name = 'app'

    def ready(self):
        from .models import create_default_site_detail
        post_migrate.connect(create_default_site_detail, sender=self)
models.py
def create_default_site_detail(sender, **kwargs):
    site = Site.objects.get(pk=settings.SITE_ID)
    SiteDetail.objects.get_or_create(site=site)

ステップ4

以下を追加

settings.py
MIDDLEWARE = [
    ~~~~~~
    'django.contrib.sites.middleware.CurrentSiteMiddleware',  # 追加
]

これにより、{{ request.site }}で設定項目にアクセスできるようになります。
例えば、{{ request.site.sitedetail.DEFAULT_FROM_EMAIL }}で、上記で設定したメアドを取得できます。

ステップ5

以下を追加

admin.py
from django.contrib import admin
from django.contrib.sites.models import Site
from .models import SiteDetail


class SiteDetailInline(admin.StackedInline):
    model = SiteDetail


class SiteAdmin(admin.ModelAdmin):
    inlines = [SiteDetailInline]


admin.site.unregister(Site)
admin.site.register(Site, SiteAdmin)

これにより、SiteとSiteDetailが同時編集できるようになります。

参考文献

以下のサイトとほぼ同じ内容ですが、一部動かない箇所があったので、Qiitaに書きました。
https://narito.ninja/blog/detail/104/

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2