2009-12-28 8 views
5

¿Cómo puedo forzar el envío de correo electrónico de activación al usuario? P.ej. cuando accidentalmente elimina el correo, hace clic en el enlace en mi sitio web, y django le enviará un nuevo correo electrónico de activación.Django-registration - alguna activación

+0

¿Puede darnos más detalles? ¿Qué enlace? – kzh

+0

Usuario accidentalmente borró el correo electrónico. Luego, inicia sesión en el sitio web y hace clic en el enlace, que le reenvía el enlace de activación. Mi pregunta es: ¿cómo puedo hacer ese enlace? Wtah debería estar en el archivo de vista. – DJpython

+0

Desafortunadamente, django-registration establece is_active en False hasta que el usuario haga clic en el enlace. La función de inicio de sesión de django predeterminada comprueba que is_active sea True. Yo también estoy buscando una manera de permitir a los usuarios iniciar sesión y elegir volver a enviar el correo electrónico. Creo que requerirá grandes cambios en django-registration y agregar un perfil de usuario con otro campo booleano que indique si confirmaron su correo electrónico o no. Su sitio debe verificar esta marca cuando autoriza a los usuarios a ver partes restringidas de su sitio. – mhost

Respuesta

8

Hay un admin action para hacerlo. Desde el django-registration docs:

No hay forma automática incorporada de hacer esta figura (cómo debe django-registro que un visitante al azar es el tipo que llena el formulario de registro hace 3 días y se elimina el correo de activación ?).

+8

Puede iniciar sesión y hacer clic en "reenviar correo electrónico de activación" en su perfil ... se usa con frecuencia en muchos sitios web. – DJpython

0

Mi solución (feo) era crear mi propio punto de vista entrada:

from django.contrib.auth.views import login as django_login 

def login(request, template_name='registration/login.html', 
      redirect_field_name=REDIRECT_FIELD_NAME, 
      redirect_authenticated=None, 
      authentication_form=AuthenticationForm): 
    """ 
     Redirect to redirect_authenticated if user is authenticated or 
     delegate to contrib login otherwise. 
    """ 

    form = authentication_form(data=request.POST) 

    if request.method == "POST": 
     if not form.is_valid(): 

      non_field_errors = form.non_field_errors() 

      if non_field_errors: 
       # test if the account is not active 
       user_inactive = non_field_errors[0].find(_("This account is inactive.")) != -1 

       if user_inactive: 
        return render_to_response(template_name, { 
         'form': form, 
         'user_inactive' : user_inactive, 
        }, context_instance=RequestContext(request)) 

    return django_login(request, template_name=template_name, 
       redirect_field_name=redirect_field_name, 
       authentication_form=authentication_form) 

Y a continuación, utilizar la variable de contexto en plantilla:

{% if user_inactive %} 
    <a href="/activation/resend/">Resend activation link</a> 
{% else %} 
    <a href="{% url django.contrib.auth.views.password_reset %}">Forgot your password?</a> 
{% endif %} 

Cuando el usuario hace clic en el enlace de activación de reenvío, Aparece un formulario que solicita el correo electrónico registrado. Al enviar el formulario se activa un nuevo correo electrónico de activación de cuenta.

Espero que esto ayude.

5

La siguiente función de vista presentará un formulario con un solo campo de correo electrónico, luego verifica si hay usuarios con este correo electrónico aún no activado, recrear el código de activación si ha caducado (el hash fue copiado de RegistrationProfile) y finalmente enviar el correo electrónico de activación.

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

def resend_activation_email(request): 
    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."),) 

      for user in users: 
       for profile in RegistrationProfile.objects.filter(user=user): 
        if profile.activation_key_expired(): 
         salt = sha_constructor(str(random())).hexdigest()[:5] 
         profile.activation_key = sha_constructor(salt+user.username).hexdigest() 
         user.date_joined = datetime.now() 
         user.save() 
         profile.save() 

        if Site._meta.installed: 
         site = Site.objects.get_current() 
        else: 
         site = RequestSite(request) 

        profile.send_activation_email(site) 

        context.update({"form" : form}) 
        return render_to_response("registration/resend_activation_email_done.html", context) 

    if not form: 
     form = ResendActivationEmailForm() 

    context.update({"form" : form}) 
    return render_to_response("registration/resend_activation_email_form.html", context) 
+0

¿Dónde pongo esta función? No quiero cambiar mi versión descargada de django-registration así que puse view.py de mi aplicación (habiendo puesto el formulario en forms.py) y obtengo este error: el nombre global 'RegistrationProfile' es no definido – HenryM

0

He actualizado la ilya b. método resend_activation_email. El método anterior muestra el error de sha deprecation en python> = 2.5

def resend_activation_email(request): 

    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.") 

      for user in users: 
       for profile in RegistrationProfile.objects.filter(user=user): 
        if profile.activation_key_expired(): 
         salt = hashlib.sha1(str(random.random())).hexdigest()[:5] 
         profile.activation_key = hashlib.sha1(salt+user.email).hexdigest() 
         user.date_joined = datetime.datetime.now() 
         user.save() 
         profile.save() 

        if Site._meta.installed: 
         site = Site.objects.get_current() 
        else: 
         site = RequestSite(request) 

        profile.send_activation_email(site) 

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

    if not form: 
     form = ResendActivationEmailForm() 

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

¿Dónde pongo esta función? No quiero cambiar mi versión descargada de django-registration así que puse view.py de mi aplicación (habiendo puesto el formulario en forms.py) y obtengo este error: el nombre global 'RegistrationProfile' es no definida – HenryM

Cuestiones relacionadas