2010-12-15 7 views
1

一部のメンバーシップを必要とするサイトを構築しました。それはクラブのウェブサイトなので、ウェブサイトのメンバーになるには、あなたは実生活のメンバーでなければなりません。クラブのメンバーが新しいメンバーを確認する予定です(ユーザーがサインアップしたときにシステムにメールを送信させる)し、管理者はDjango管理者のユーザーの記録の下にあるactiveチェックボックスをチェックし、ユーザー。アクティブ状態が変更された場合、DjangoユーザーにEメールを送信してください。

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

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

私はすべての電子メールのロジックの上にあります、私はそれを置く場所を知る必要があります。

他のテスト方法もありますが(active==Trueのアカウントでlast_login==Noneをチェックしてください)、通知が近いほど瞬時になるようにしたいと思います。

+0

を使用することができます。私は現在あなたが探しているものにほぼ正確なものに取り組んでいます。 –

答えて

1

はい、django signals、具体的にはpost_save()を使用する必要があります。これはおそらく推測したように、モデルの保存後に呼び出され、必要な保存保存機能(データベースへの書き込み)を実装することができます。

+0

それは正しい場所で私を得るが、「アクティブ」状態が変更されたかどうかをどのように伝えるか? – Oli

+0

@Oliアクティブな場合、モデルのBooleanFieldは 'if instance.active == True:'を使用します。 –

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

は、この情報がお役に立てば幸い!

1

OK 5年間は、後者が、これはジャンゴ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) 
関連する問題