【问题标题】:django model post_save send email if allowed from user profile如果用户配置文件允许,django model post_save 发送电子邮件
【发布时间】:2013-03-29 11:33:26
【问题描述】:

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

models.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 而崩溃。

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

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

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

      • sender:模型类。
      • 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)
      

      【讨论】:

      • 谢谢丹尼尔,但我收到同样的错误`'LogEntry'对象没有属性'whom'`
      • 您的post_save.connect(send_notification, sender=Follow) 行是否在您的models.py 文件中?如果它在其他地方,例如signals.py,那么听起来您只是没有在signals.py 中导入Follow 类模型。
      • 是的,它包括上面的意图,但是当我添加`sender=Follow`时,django 崩溃,正如我上面解释的那样。
      • 谢谢丹尼尔对齐是关键,但你帮了我很多,再次感谢。
      猜你喜欢
      • 2013-05-05
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 2017-09-14
      • 1970-01-01
      • 2011-03-07
      • 2022-07-17
      相关资源
      最近更新 更多