2011-11-01 12 views

Respuesta

6

Aquí es cómo se puede hacer la anulación:

urls.py

url(r'^user/password/reset/$', 
    'YOUR_APP.views.password_reset', 
    {'post_reset_redirect' : '/#/login?resetemail=true'}, 
    name="password_reset"), 

views.py

from django.contrib.auth.views import password_reset as django_password_reset 
from YOUR_APP.forms import CustomPasswordResetForm 

def password_reset(*args, **kwargs): 
    """ 
     Overriding the Email Password Resert Forms Save to be able to send HTML email 
    """ 
    kwargs['password_reset_form'] = CustomPasswordResetForm 
    return django_password_reset(*args, **kwargs) 

form.py

from django.contrib.auth.forms import PasswordResetForm 
from django.contrib.auth.tokens import default_token_generator 

class CustomPasswordResetForm(PasswordResetForm): 
    """ 
     Overriding the Email Password Resert Forms Save to be able to send HTML email 
    """ 
    def save(self, domain_override=None, email_template_name='registration/password_reset_email.html', 
      use_https=False, token_generator=default_token_generator, request=None, email_subject_name='registration/password_reset_subject.txt', **kwargs): 
     from django.core.mail import EmailMultiAlternatives 
     from django.utils.html import strip_tags 
     from django.template.loader import render_to_string 
     from django.contrib.sites.models import get_current_site 
     from django.utils.http import int_to_base36 

     for user in self.users_cache: 
      if not domain_override: 
       current_site = get_current_site(request) 
       site_name = current_site.name 
       domain = current_site.domain 
      else: 
       site_name = domain = domain_override 

      c = { 
       'email': user.email, 
       'domain': domain, 
       'site_name': site_name, 
       'uid': int_to_base36(user.id), 
       'user': user, 
       'token': token_generator.make_token(user), 
       'protocol': use_https and 'https' or 'http', 
      } 
      render = render_to_string(email_template_name, c) 
      render_subject = render_to_string(email_subject_name, c) 

      msg = EmailMultiAlternatives(render_subject, strip_tags(render), None, [user.email]) 
      msg.attach_alternative(render, "text/html") 
      msg.send() 
+2

consigo este error: AttributeError en/usuario/contraseña/reset/ El objeto 'CustomPasswordResetForm' no tiene att ribute 'users_cache'. ¿Cometió un error? ¿Debo usar alguna otra función en lugar de users_cache()? ¿Qué hacen los demás? –

5

Puede anular el método save de django.contrib.auth.forms.PasswordResetForm y pasar un nuevo formulario como argumento a la vista password_reset.

0

Después de una cierta cantidad de prueba y error, descubro d una manera mucho más concisa de proporcionar un correo electrónico personalizado para restablecer contraseñas en la última versión de Django (1.8).

En su project/urls.py, añadir estas importaciones:

from django.contrib.auth import views as auth_views 
from django.core.urlresolvers import reverse_lazy 

Y agregue la ruta siguiente en sus urlpatterns antes de la habitual Django contrib auth URL ruta de inclusión:

url(r'^accounts/password/reset/$', 
    auth_views.password_reset, 
    { 
    'post_reset_redirect': reverse_lazy('auth_password_reset_done'), 
    'html_email_template_name': 'registration/password_reset_html_email.html' 
    }, 
    name='auth_password_reset'), 


url('^', include('django.contrib.auth.urls')), 

Y entonces, en sus de aplicaciones templates/registration carpeta, crea el password_reset_html_email.html con la plantilla HTML que quieras.

La razón de que esto parecía laico necesaria en la fuente para django/contrib/auth/views.py, que tiene la función de vista la ruta URL original se asigna a:

147 def password_reset(request, is_admin_site=False, 
148     template_name='registration/password_reset_form.html', 
149     email_template_name='registration/password_reset_email.html', 
150     subject_template_name='registration/password_reset_subject.txt', 
151     password_reset_form=PasswordResetForm, 
152     token_generator=default_token_generator, 
153     post_reset_redirect=None, 
154     from_email=None, 
155     current_app=None, 
156     extra_context=None, 
157     html_email_template_name=None): 
158 

El html_email_template_name se establece en None por defecto, y no lo hicieron parece ser una forma de asignar su valor, además de reescribir esta ruta específica para este caso como mencioné anteriormente.

Esperemos que esto ayude sin necesidad de copiar y pegar un montón de código casi idéntico, como algunas de las otras respuestas sugeridas. ¡Los comentarios son bienvenidos, por supuesto!

0

Para mí, la investigación llevó mucho tiempo, pero la solución es bastante trivial. No anula ningún toque de formularios o algo por el estilo estoy usando Django == 1.8.6 pero debería funcionar desde al menos django 1.7 en adelante. Para habilitar el soporte para mensajes de correo electrónico con formato HTML en password_reset todo lo que tenía que hacer es cambiar el nombre de la clave plantilla de correo electrónico en función de restablecimiento de email_template_name = 'e-mails/password_reset_email_html.html

a

html _email_template_name =' correos electrónicos/password_reset_email_html.html',

así la función de restablecimiento se vería como tal:

def reset(request): 
# Wrap the built-in password reset view and pass it the arguments 
# like the template name, email template name, subject template name 
# and the url to redirect after the password reset is initiated. 
return password_reset(request, template_name='profile/reset.html', 
    html_email_template_name='emails/password_reset_email_html.html', 
    subject_template_name='emails/reset_subject.txt', 
    post_reset_redirect=reverse('success')) 
0

basado en la solución Cem Kozinoglu sugeriría a cambiar la forma y send_mail sobrecarga en lugar de guardar el método de la siguiente manera:

class CustomPasswordResetForm(PasswordResetForm): 

    def send_mail(self, subject_template_name, email_template_name, 
        context, from_email, to_email, html_email_template_name=None): 
     """ 
      Sends a django.core.mail.EmailMultiAlternatives to `to_email`. 
     """ 
     subject = loader.render_to_string(subject_template_name, context) 
     # Email subject *must not* contain newlines 
     subject = ''.join(subject.splitlines()) 
     body = loader.render_to_string(email_template_name, context) 

     email_message = EmailMultiAlternatives(subject, body, from_email, [to_email]) 
     # New line introduce 
     email_message.attach_alternative(body, 'text/html') 

     if html_email_template_name is not None: 
      html_email = loader.render_to_string(html_email_template_name, context) 
      email_message.attach_alternative(html_email, 'text/html') 

     email_message.send() 
0

puede utilizar PasswordResetSerializer http://django-rest-auth.readthedocs.io/en/latest/configuration.html

A continuación, puede anular todas las opciones del formulario:

domain_override subject_template_name email_template_name use_https token_generator FROM_EMAIL solicitud html_email_template_name extra_email_context

en mi caso me acaba de anulación 2 apoyos

class CustomPasswordResetSerializer(PasswordResetSerializer): 

    def get_email_options(self): 
     return { 
      'domain_override': 'anydomain.com', 
      'html_email_template_name': 'your_temp/password_reset_email.html', 
     } 
Cuestiones relacionadas