【问题标题】:Send an email if to a Django User if their active status is changed如果 Django 用户的活动状态发生更改,则向其发送电子邮件
【发布时间】:2011-05-25 23:25:10
【问题描述】:

我已经建立了一个网站,该网站的某些部分需要会员资格。这是一个俱乐部网站,所以要成为网站上的会员,您必须在现实生活中成为会员。计划是让俱乐部中的某个人检查新成员(当用户注册时,我可能会让系统向他们发送一封电子邮件),然后管理员检查 Django 管理员中用户记录下的active 复选框,然后拯救用户。

我要解决的问题是我们需要通知新的有效用户何时可以开始使用他们的帐户。显然手动发送电子邮件很麻烦。

有没有办法挂钩save() 逻辑,检查记录的active 状态是否已更改,如果已激活,请向该用户发送一封电子邮件,告诉他们现在可以登录了吗?

我掌握了所有电子邮件逻辑,我只需要知道把它放在哪里。

我知道还有其他测试方法(在 cron 式工作中检查 active==True 帐户上的 last_login==None),但我希望通知几乎是即时的。

【问题讨论】:

  • 如果我之前的回答还不够,您需要进一步的帮助,请告诉我。我目前正在研究与您正在寻找的几乎精确的东西。

标签: django django-models django-users


【解决方案1】:

是的,您需要使用django signals,特别是post_save()。正如您可能猜到的那样,在保存模型之后调用 get ,然后您可以实现所需的任何后保存功能(即,后写入数据库)。

【讨论】:

  • 好的,这让我进入了正确的位置,但是我如何判断 active 状态是否已更改?
  • @Oli 如果 active 是模型中的 BooleanField,则使用 if instance.active == True:
【解决方案2】:

这尚未经过测试,但这是我所做的类似操作的修改版本:

from django.contrib.auth.models import User
from django.db.models import signals
from django.conf import settings
from django.core.mail import send_mail

def pre_user_save(sender, instance, *args, **kwargs):
    if instance.active != User.objects.get(id=instance.id).active:
        send_mail(
            subject='Active changed: %s -> %s' % (instance.username, instance.active),
            message='Guess who changed active status??',
            from_email=settings.SERVER_EMAIL,
            recipient_list=[p[1] for p in settings.MANAGERS],
        )
signals.pre_save.connect(pre_user_save, sender=User, dispatch_uid='pre_user_save')

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    好的 5 年后,但这对我来说适用于 django 1.8 和 python 2.7

    上下文是:用户创建一个新帐户,然后管理员收到一封电子邮件以验证用户并在管理员进行更改时将活动更改为 True 用户收到一封电子邮件,告诉他现在可以登录。

    对不起,我的英语不好。

    #forms.py
    from django import forms
    from django.contrib.auth.forms import UserCreationForm
    from django.contrib.auth.models import User
    
    #A register form that save field is_active as False
    class RegisterForm(UserCreationForm):
        email = forms.EmailField(label=_("E-mail"))
        first_name = forms.CharField(label=_("First Name"))
        last_name = forms.CharField(label=_("Last Name"))
        is_active = forms.BooleanField(required=False, initial=False, label=_("Activo"), widget=forms.HiddenInput())
    
        class Meta:
            model = User
            fields = ('username','first_name','last_name','email','password1','password2','is_active')
    
            def save(self, commit=True):
                user = super(UserCreationForm, self).save(commit=False)
                user.first_name = self.cleaned_data['first_name']
                user.last_name = self.cleaned_data['last_name']
                user.email = self.cleaned_data['email']
                user.is_active = self.cleaned_data['is_active']
                if commit:
                    user.save()
                return user
    

    我在 models.py 文件中使用信号,但您可以在 signals.py 文件中使用它

    #models.py
    from django.contrib.auth.models import User
    from django.db.models import signals
    from django.db import models
    from django.dispatch import receiver
    from django.db.models.signals import pre_save, post_save
    from django.conf import settings
    from django.core.mail import send_mail
    
    #signal used for is_active=False to is_active=True
    @receiver(pre_save, sender=User, dispatch_uid='active')
    def active(sender, instance, **kwargs):
        if instance.is_active and User.objects.filter(pk=instance.pk, is_active=False).exists():
            subject = 'Active account'
            mesagge = '%s your account is now active' %(instance.username)
            from_email = settings.EMAIL_HOST_USER
            send_mail(subject, mesagge, from_email, [instance.email], fail_silently=False)
    
    #signal to send an email to the admin when a user creates a new account
    @receiver(post_save, sender=User, dispatch_uid='register')
    def register(sender, instance, **kwargs):
        if kwargs.get('created', False):
            subject = 'Verificatión of the %s account' %(instance.username)
            mesagge = 'here goes your message to the admin'
            from_email = settings.EMAIL_HOST_USER
            send_mail(subject, mesagge, from_email, [from_email], fail_silently=False)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-15
      • 2011-01-02
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 2011-10-05
      • 1970-01-01
      相关资源
      最近更新 更多