save()至少需要2个参数(给定1个)

时间:2015-06-25 10:57:49

标签: python django

我正在尝试在字段更改后发送电子邮件。我已经完成了我的研究并看到了很多类似问题的解决方案,但似乎没有解决我的问题。

似乎问题来自于我在save方法的开头定义'user'的事实。请帮忙!

class CountryList(model.Models):
    score= models.PositiveSmallIntegerField(null=True, blank = True, choices=zip(range(1, 11), range(1, 11)))  
    country = models.CharField(max_length=100, null =True, blank=True)  

    def save(self, user, *args, **kwargs):  
        old_CountryList = CountryList.objects.get(pk=self.id)    
        if old_CountryList.score!= self.score: 
            send_mail('The user ' + user.username + ' has changed the Score for ' + self.country \
                  + 'from ' + str(old_CountryList.score) + ' to '                    \
                  + str(self.score) + '.\nThis change was made at '                       \
                  + str(datetime.datetime.now())[:19] + '. \n\nLink to the change: http://'         \
                  + socket.gethostname() + '/home/countries/' + str(self.id),           # email body
                  'some_email_here',                                                 # send from
                  settings.EMAIL_RECIPIENTS,                                                   # send to
                  fail_silently=False)  
        super(CountryList, self).save(*args, **kwargs) # Call the "real" save() 

1 个答案:

答案 0 :(得分:1)

Django的Model API期望Model.save()坚持定义的签名,因为框架的其他部分,贡献和第三方应用依赖于此。

同样从Model.save()方法发送邮件真的是一个糟糕的想法......你必须明白模型是(并且必须保持)与HTTP请求(视图...)周期严格分离 - 因为它们也可能被其他代码修改(想想自定义管理命令等),你不一定有手头的“当前用户”(也不想向任何人发送邮件)。

在您的情况下,因为您显然只关心通过应用程序的视图进行更改,邮件应该由视图本身发送。