首页 > 解决方案 > 如何在signals.py文件中获取当前登录的用户?

问题描述

我正在制作一个待办事项应用程序,其中一个功能是向用户发送一封电子邮件,说明他的任务已过期

部分views.py文件:

from .models import Todo
from django.utils import timezone
from .signals import overdue

def index(request):
    ...
    overdue_tasks = Todo.objects.filter(time__lte=timezone.now())
    if overdue_tasks:
        overdue.send_robust(sender=Todo)
    ...
    return render(request, 'todo/index.html', {'overdue_tasks' : overdue_tasks })

部分信号.py文件:

from django.dispatch import receiver, Signal
from .models import Todo
from django.core.mail import send_mail

overdue = Signal()
user_email = request.user.email

@receiver(overdue)
def my_handler(sender, **kwargs):
    send_mail('Subject', 'Your task was Overdue !', 'myemail@gmail.com', 'user_email', fail_silently=False)'

它引发了异常:

“NameError:名称'请求未定义。”

标签: pythondjangodjango-signalsdjango-emaildjango-messages

解决方案


您正在尝试在request.user.email没有访问请求的情况下访问请求槽,您可以在视图中访问用户电子邮件index,将电子邮件作为 **kwarg 传递并访问my_handler

def index(request):
    ...
    overdue_tasks = Todo.objects.filter(time__lte=timezone.now())
    if overdue_tasks:
        overdue.send_robust(sender=Todo, email=request.user.email)
    ...
    return render(request, 'todo/index.html', {'overdue_tasks' : overdue_tasks })

@receiver(overdue)
def my_handler(sender, **kwargs):
    email = kwargs.get('email')
    send_mail(foo)

推荐阅读