0

保存对象后,我正在尝试向用户发送电子邮件。但是在发送之前无法让用户个人资料找到是否允许。

模型.py

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    ...
    notifications = models.BooleanField(default=True)
    ...

class Follow(models.Model):
    who = models.ForeignKey(User, related_name='he_follow')
    whom = models.ForeignKey(User, related_name='him_follow')

    ...

    def send_notification(sender, created, **kwargs):
        if created:
            obj = kwargs['instance']
            check_it = obj.whom.get_profile().notifications
            if check_it == True:
                #rest code for sending emails works
            else:
                pass

    post_save.connect(send_notification)

这返回错误'LogEntry' object has no attribute 'whom' ,所以我认为这是因为 post_save 中没有发件人。但是在我将 post_save 行更改为 `

    post_save.connect(send_notification, sender=Follow)

django 因错误而崩溃NameError: name 'Follow' is not defined

4

2 回答 2

2

真正的问题是您的功能的对齐方式。你把它放在跟随模型下,它必须在模型之外。

class Follow(models.Model):
    who = models.ForeignKey(User, related_name='he_follow')
    whom = models.ForeignKey(User, related_name='him_follow')

    ...

//align with Follow model don't put it inside

def send_notification(sender, created, **kwargs):
    if created:
        obj = kwargs['instance']
        check_it = obj.whom.get_profile().notifications
        if check_it == True:
            #rest code for sending emails works
        else:
            pass

post_save.connect(send_notification, sender=Follow)
于 2013-03-29T12:15:38.503 回答
1

检查您需要/发送到的参数send_notification

使用 post_save 信号发送的参数(Django Docs 中的 post_save):

  • 发件人:模型类。
  • instance:正在保存的实际实例。
  • 创建:一个布尔值;如果创建了新记录,则为真。
  • raw:一个布尔值;如果模型完全按照呈现方式保存(即加载夹具时),则为真。不应查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态。
  • using:正在使用的数据库别名。

您的send_notification方法在signals.py文件中应如下所示:

from yourproject.yourapp.models import Follow

... 

def send_notification(sender, **kwargs):
    if kwargs['created']:
        check_it = kwargs['instance'].whom.get_profile().notifications
        if check_it == True:
            #rest code for sending emails works
        else:
            pass

post_save.connect(send_notification, sender=Follow)
于 2013-03-29T11:47:18.057 回答