2

我在我的 django 项目中写了一个信号,在里面我想发送一封包含我网站完整路径的电子邮件。但要这样做,我需要在信号中获取请求对象,我该怎么做呢?谢谢。

    @receiver(pre_save, sender=AccessRequest)
    def email_if_access_true(sender, instance, **kwargs):
        #How can I get the full path of my website here?
        pass
4

3 回答 3

3

如果您无权访问请求对象,则可以使用 Site 模型管理器的 get_current() 方法。

from django.contrib.sites.models import Site

@receiver(pre_save, sender=AccessRequest)
def email_if_access_true(sender, instance, **kwargs):
    current_site = Site.objects.get_current()
    if current_site.domain == 'foo.com':
        #do other stuff here
    else:
        pass

您需要确保您SITE_ID=1在设置中定义

于 2013-03-20T10:25:51.470 回答
2

将以下代码放入您的pre_save信号接收器中:

from django.contrib.sites.models import get_current_site
current_site = get_current_site(request=None)
domain = current_site.domain
protocol = "http"

您可以通过将所需的上下文变量传递给模板,在电子邮件中生成您网站的绝对 URL。如果access_request在您的情况下是实例并且您的模型中有一个get_abosulte_url()方法AccessRequest,那么电子邮件模板中的以下行将为您提供绝对 URL。

{{ protocol }}://{{ domain }}{% access_request.get_absolute_url %}

参考 - PasswordResetFormdjango.contrib.auth.form.

于 2013-03-20T10:31:25.467 回答
1

如果您无权访问请求对象,则可以使用 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

要启用站点框架,请执行以下步骤:

  1. 将“django.contrib.sites”添加到您的 INSTALLED_APPS 设置中。
  2. 定义 SITE_ID 设置:SITE_ID = 1
  3. 运行迁移。

来源: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

于 2021-07-05T06:55:07.463 回答