0

我有一个相对简单的目标:当用户注册并激活包含用户信息(如用户名、电子邮件等)的帐户时,向 Django 管理员发送电子邮件。我django-registration用于处理注册过程。然后我使用信号发送电子邮件。这个过程工作得很好,但是一旦我尝试将用户、用户名或用户的电子邮件注入电子邮件模板,我就会遇到麻烦。

这是我的signal_connectors.py

from django.core.mail import mail_admins
from django.dispatch import receiver
from registration.signals import user_registered
from django.template.loader import render_to_string

@receiver(user_registered, dispatch_uid="common.signal_connectors.user_registered_handler")
def user_registered_handler(sender, **kwargs):

    print('user registration completed...')

    subject = 'registration notify'
    template = 'common/email.html'
    message = render_to_string(template, {'user': user})
    from_email = 'from@example.com'

    # send email to admins, if user has been registered
    mail_admins(subject, message, fail_silently=False, connection=None, html_message=None)

    print('sending email to administrators...')

模板是这样的:

{{ user }} has registered at example.com

我尝试过类似{{user}}, {{user.username}},{{request.user.username}}等的变体。此外,在message上面的变量中signals_connectors.py,我尝试了变体,并带有相应的导入语句。

我还尝试过渲染带有上下文集的模板,以及我在网上找到的其他变体,例如:

查找 django-registration 用户名变量

我不断收到这样的错误:

global name 'user' is not defined

我想我已经正确设置了模板上下文处理,因为我可以{{ user.username }}在另一个模板中使用类似的东西并且它可以工作。

我还尝试更正我的导入语句以包含必要的对象,但没有运气。我已经尝试了大部分我可以在网上找到的关于这个主题的内容,所以我很茫然......

我错过了什么?

4

1 回答 1

1

我没有意识到这很容易。基于这篇文章:

信号处理程序应该放在 django 项目中的什么位置?

我尝试在信号连接器方法中实际添加用户和请求作为参数,这很有效:

. . .

@receiver(user_registered, dispatch_uid="common.signal_connectors.user_registered_handler")
def user_registered_handler(sender, user, request, **kwargs):

. . .

然后,我在电子邮件模板中使用了它:

{{ user }} 已在 example.com 注册

我可能想多了,但我很惊讶没有人站出来帮助解决这个问题……

于 2014-01-03T17:13:36.383 回答