我正在尝试使用django信号发送一个包含我的网址的电子邮件。我发现了这个问题:https://stackoverflow.com/a/15521046/2385132并按照接受的答案中的建议继续进行,但在使用该代码时,我收到此错误:
AttributeError: 'NoneType' object has no attribute 'get_host'
哪个来自我的代码中的get_current_site
:
@receiver(post_save, sender=MyModel)
def post_obj_save(sender, instance: MyModel, **kwargs):
def _get_html(obj: MyModel):
return render_to_string('confirmation_email.html', _get_context(obj))
def _get_context(obj: MyModel):
current_site = get_current_site(request=None)
domain = current_site.domain
action = reverse('obj_activation', request=None, format=None, kwargs={})
url = '{protocol}://{domain}/{action}'.format(protocol=PROTOCOL, domain=domain, action=action)
return {
'header': _('Thank you for registering with ASDF.'),
'prompt': _('In order to be able to log in into ASDF administrator panel, you have to activate your account using'),
'link_name': _('this link'),
'activation_url': url
}
send_mail(
_('ASDF account activation'),
_get_html(instance),
EMAIL_FROM,
[obj.owner.email],
fail_silently=False,
)
所以问题是:如何在信号中获得我的观点的完整网址?
顺便说一下。我正在使用django-rest-framework
。
答案 0 :(得分:3)
在最近的Django版本中(可能是您的情况),如果您的设置中未定义SITE_ID
,则始终从请求中删除。请参阅1.8 Django版本中引入的this更改:
在Django 1.8中更改:
此功能现在将基于查找当前站点 request.get_host()如果未定义SITE_ID设置。
因此,在您的情况request=None
中,您必须启用sites
framework,当前网站/域的条目和SITE_ID
设置指向{{1}中的正确实例}表,尝试这个,你会看到:)