1

一部のメンバーシップが必要なサイトを構築しました。クラブのウェブサイトなので、ウェブサイトのメンバーになるには、実際にメンバーになる必要があります。計画では、クラブの誰かに新しいメンバーをチェックしてもらい (おそらく、ユーザーがサインアップしたときにシステムから電子メールを送信するようにします)、管理者activeは Django 管理画面でユーザーのレコードの下にあるチェックボックスをオンにして、ユーザーを保存します。 .

私が克服しようとしている問題は、アカウントの使用をいつ開始できるかについて、新しい有効なユーザーに通知する必要があることです。明らかに、手動で電子メールを送信するのは面倒です。

ロジックにフックしsave()、レコードのactive状態が変更されたかどうかを確認し、アクティブ化されている場合は、そのユーザーにログインできることを知らせるメールを送信する方法はありますか?

私はすべての電子メール ロジックを把握しています。必要なのは、それをどこに置くかを知ることだけです。

他のテスト方法 (cron スタイルのジョブのアカウントをチェックする) があることは認識していlast_login==Noneますactive==Trueが、通知が十分に瞬時に行われるようにしたいと考えています。

4

3 に答える 3

1

はい、 django シグナル、特にpost_save()を使用する必要があります。おそらくご想像のとおり、これはモデルの保存後に呼び出され、その後、必要な保存後機能 (つまり、データベースへの書き込み後) を実装できます。

于 2010-12-15T15:03:48.763 に答える
1

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)
于 2015-12-30T06:27:17.527 に答える
0

これはテストされていませんが、私が行っていることの修正版は次のとおりです。

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')

お役に立てれば!

于 2010-12-15T21:07:30.857 に答える