在我看来,最好的方法是使用inheritance添加与站点模型相关的模型
首先将站点 ID 添加到您的 Django 设置文件中
SITE_ID = 1
现在在应用中创建模型
from django.db import models
from django.contrib.sites.models import Site
class Settings(Site):
field_a = models.CharField(max_length=150, null=True)
field_b = models.CharField(max_length=150, null=True)
class Meta:
verbose_name_plural = 'settings'
db_table = 'core_settings' # core is name of my app
def __str__(self) -> str:
return 'Settings'
然后编辑该应用的apps.py文件
from django.apps import AppConfig
from django.db.models.signals import post_migrate
def build_settings(sender, **kwargs):
from django.contrib.sites.models import Site
from .models import Settings
if Settings.objects.count() < 1:
Settings.objects.create(site_ptr=Site.objects.first())
class CoreConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'project.apps.core'
def ready(self) -> None:
post_migrate.connect(build_settings, sender=self)
现在每次运行迁移时都会在 core_settings 中自动生成一行,与您的站点模型具有一对一的关系
现在您可以像这样访问您的设置
Site.objects.get_current().settings.access_id
可选:如果只有一个站点
从管理站点注销站点模型并禁用在管理面板中创建和删除设置模型
from django.contrib import admin
from . import models
from django.contrib.sites.models import Site
admin.site.unregister(Site)
@admin.register(models.Settings)
class SettingAdminModel(admin.ModelAdmin):
def has_delete_permission(self, request,obj=None) -> bool:
return False
def has_add_permission(self, request) -> bool:
return False