2010-12-15 1 views
1

일부 사이트에서는 회원 자격이 필요한 사이트를 만들었습니다. 클럽 웹 사이트이므로 웹 사이트에 회원으로 가입하려면 실제 회원이되어야합니다. 이 계획은 신입 회원을위한 클럽 수표를 수여하는 것입니다 (사용자가 가입 할 때 시스템에 이메일을 보내도록 할 것입니다). 그러면 관리자가 장고 관리자의 사용자 기록 아래에있는 active 체크 박스를 확인하고 사용자.활성 상태가 변경된 경우 Django 사용자에게 전자 메일 보내기

내가 극복하려는 문제는 새로운 유효한 사용자에게 언제 계정 사용을 시작할 수 있는지 알려주는 것입니다. 분명히 수동으로 이메일을 보내는 것은 번거 롭습니다.

save() 로직에 연결하는 방법이 있습니까? 해당 레코드의 active 상태가 변경되었는지 확인하고, 활성화 된 경우 해당 사용자에게 로그인 할 수 있음을 알리는 전자 메일을 보내시겠습니까?

나는 모든 이메일 논리 위에 있으며, 어디에 넣어야 하는지를 알아야합니다.

다른 테스트 방법이 있다는 것을 알고 있습니다. (active==True의 cron 스타일 작업에 대한 last_login==None을 확인하십시오.)하지만 알림이 거의 즉시 제공되기를 바랍니다.

+0

내 이전의 대답은 충분하지 않았다 당신이 더 도움이 필요하면 알려합시다 signals.py 파일에 사용할 수 있습니다. 나는 현재 당신이 찾고있는 것과 거의 일치하는 어떤 것에 노력하고 있습니다. –

답변

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

확인 오년 후자 그러나 이것은 장고 1.8 파이썬과 나를 위해 작동 2.7

이다 컨텍스트 : 사용자가 새 계정을 만들 수는 관리자가 사용자를 확인하고 True로 활동 CHAGE하는 이메일을받을 때 관리자는 사용자가 지금 로그인 할 수 있음을 알리는 이메일을받습니다.

영어로 죄송합니다.

#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 파일의 신호를 사용하지만 당신은

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