2016-05-18 18 views
5

Ich benutze django-registration mit eindeutigen E-Mail-Adressen und ich möchte in der Lage sein, ein zweites Aktivierungsformular an eine E-Mail zu senden, wenn der Benutzer es wünscht und der Account noch nicht aktiv ist. Ich habe dieses link auf Stackoverflow gefunden, aber ich verstehe nicht, wo ich die Routine setzen sollte. Ich habe meine App views.py steckte es in und ich erhalte den FehlerDjango-Registrierung erneut senden E-Mail mit neuem Code

global name 'RegistrationProfile' is not defined 

das ist, weil RegistrationProfile ein Modell in Registrierung ist aber nicht eine Tabelle/Datensatz in der Datenbank erstellen, wenn eine Aktivierung Formular wird gesendet, damit ich nicht verstehe, wie ich darauf zugreifen kann.

Jeder Rat wäre willkommen.

+0

Haben Sie versucht, RegistrationProfile aus Registrierung – marcusshep

+0

zu importieren, was meinst du Formular erneut senden? Das ergibt keinen Sinn. Meinten Sie, Aktivierungs-E-Mails erneut zu senden? Dies ist wahrscheinlich, warum Ihre Frage keine Antwort erhalten, bevor Sie die Bounty ausgegeben – e4c5

+0

Ich habe versucht Import RegistrationProfile und ja, ich möchte erneut senden (oder senden Sie eine neue) Aktivierungs-E-Mail – HenryM

Antwort

2

OK, also das ist die Lösung, die ich mir ausgedacht habe. Es ist vielleicht nicht das Schönste, aber es funktioniert für mich.

Dies wird hinzugefügt

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) 

Dieses hinzugefügt views.py wird

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

Ich habe eine neue Vorlage in Registrierung resend_activation_email_form.html aufgerufen forms.py, die verwendet wird, wenn die E-Mail wurde erneut gesendet, aber ich habe genau die gleiche Vorlage verwendet, um die E-Mail zu senden.

Ich habe dies auf E-Mail basiert, weil ich einzigartige E-Mails verwenden, aber es ist möglicherweise sinnvoller, es auf den Benutzernamen zu basieren, da dies von Django-Registrierung als einzigartig definiert ist.