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/