如果您无权访问请求对象,则可以使用 Site 模型管理器的 get_current() 方法。
from django.contrib.sites.models import Site
@receiver(pre_save, sender=MyModel)
def my_function_without_request(sender, instance, **kwargs):
current_site = Site.objects.get_current()
domain = current_site.domain
# Do something
要启用站点框架,请执行以下步骤:
- 将“django.contrib.sites”添加到您的 INSTALLED_APPS 设置中。
- 定义 SITE_ID 设置:SITE_ID = 1
- 运行迁移。
来源:https://docs.djangoproject.com/en/3.2/ref/contrib/sites/
要为您的项目设置正确的名称和域,您可以使用数据迁移。
首先,创建一个可以使用的空迁移文件(Django 会将文件放在正确的位置,建议一个名称,并为您添加依赖项):
python manage.py makemigrations --empty yourappname
然后,打开文件并创建一个新函数并让 RunPython 使用它。
from django.contrib.sites.models import Site
from django.db import migrations
def set_name_and_domain():
one = Site.objects.all()[0]
one.domain = 'yourdomain.com'
one.name = 'Your Name'
one.save()
class Migration(migrations.Migration):
dependencies = [
('yourappname', '0001_initial'),
]
operations = [
migrations.RunPython(set_name_and_domain),
]
所有这些都会将您的域名和站点名称保存在您的数据库中,您可以在没有请求对象的情况下访问它。到目前为止,我还没有找到更好的方法来做到这一点。
来源:https://docs.djangoproject.com/en/3.2/topics/migrations/#data-migrations