2016-05-18 12 views
5

Używam django-registration z unikalnymi adresami e-mail i chcę mieć możliwość wysłania drugiego formularza aktywacyjnego do wiadomości e-mail na żądanie użytkownika i jeśli konto nie jest jeszcze aktywne. Znalazłem ten link na Stackoverflow, ale nie rozumiem, gdzie powinienem umieścić rutynę. Mam umieścić go w mojej aplikacji views.py i Dostaję błądAktywacja ponownego wysłania zgłoszenia Django E-mail z nowym kodem

global name 'RegistrationProfile' is not defined 

co wynika RegistrationProfile jest modelem w rejestracji, ale nie utworzyć tabelę/zapis w mojej bazy danych, gdy aktywacja Formularz jest wysyłany, więc nie rozumiem, jak mogę uzyskać do niego dostęp.

Każda rada byłaby mile widziana.

+0

Czy próbowałeś zaimportować RegistrationProfile z rejestracji – marcusshep

+0

co masz na myśli ponownie w formularzu aktywacyjnym? To nie ma sensu. Czy chodziło Ci o e-mail aktywacyjny do ponownego wysłania? Prawdopodobnie dlatego twoje pytanie nie dostało odpowiedzi, zanim wydałeś nagrodę – e4c5

+0

Próbowałem zaimportować RegistrationProfile i tak, chcę wysłać (lub wysłać nowy) email aktywacyjny – HenryM

Odpowiedz

2

OK, więc to jest rozwiązanie, które wymyśliłem. Może nie jest najładniejsza, ale działa dla mnie.

ten jest dodawany do views.py

from .forms import ResendActivationEmailForm 
from django.core import signing 
from django.contrib.sites.shortcuts import get_current_site 
from django.template.loader import render_to_string 


def resend_activation_email(request): 

    email_body_template = 'registration/activation_email.txt' 
    email_subject_template = 'registration/activation_email_subject.txt' 

    if not request.user.is_anonymous(): 
     return HttpResponseRedirect('/') 

    context = Context() 

    form = None 
    if request.method == 'POST': 
     form = ResendActivationEmailForm(request.POST) 
     if form.is_valid(): 
      email = form.cleaned_data["email"] 
      users = User.objects.filter(email=email, is_active=0) 

      if not users.count(): 
       form._errors["email"] = ["Account for email address is not registered or already activated."] 

      REGISTRATION_SALT = getattr(settings, 'REGISTRATION_SALT', 'registration') 
      for user in users: 
       activation_key = signing.dumps(
        obj=getattr(user, user.USERNAME_FIELD), 
        salt=REGISTRATION_SALT, 
        ) 
       context = {} 
       context['activation_key'] = activation_key 
       context['expiration_days'] = settings.ACCOUNT_ACTIVATION_DAYS 
       context['site'] = get_current_site(request) 

       subject = render_to_string(email_subject_template, 
            context) 
       # Force subject to a single line to avoid header-injection 
       # issues. 
       subject = ''.join(subject.splitlines()) 
       message = render_to_string(email_body_template, 
              context) 
       user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL) 
       return render(request, 'registration/resend_activation_email_done.html') 

    if not form: 
     form = ResendActivationEmailForm() 

    context.update({"form" : form}) 
    return render(request, 'registration/resend_activation_email_form.html', context) 

ten jest dodawany do forms.py

class ResendActivationEmailForm(forms.Form): 
    email = forms.EmailField(required=True) 

mam nowy szablon w rejestracji nazywa resend_activation_email_form.html który jest używany, gdy e-mail został wysłany ponownie, ale użyłem dokładnie tego samego szablonu, aby wysłać wiadomość e-mail.

Oparłem to na wiadomościach e-mail, ponieważ korzystam z unikatowych wiadomości e-mail, ale rozsądniej jest oprzeć je na nazwie użytkownika, ponieważ jest to zdefiniowane jako unikalne przez rejestrację django.