2011-11-01 15 views

risposta

6

Ecco come si può fare l'override:

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

ottengo questo errore: AttributeError a/utente/password/reset/ L'oggetto 'CustomPasswordResetForm' non ha att ribute 'users_cache'. Hai fatto un errore? Dovrei usare qualche altra funzione invece di users_cache()? Cosa fanno gli altri. –

5

È possibile eseguire l'override del metodo save di django.contrib.auth.forms.PasswordResetForm e passare il nuovo modulo come argomento alla vista password_reset.

0

Dopo una certa quantità di prove ed errori, ho discovere d un modo molto, molto più teso, di fornire un'e-mail personalizzata di reimpostazione della password basata su modelli nell'ultima versione di Django (1.8).

Nel vostro project/urls.py, aggiungere queste importazioni:

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

e aggiungere il seguente percorso nel vostro urlpatterns prima della consueta Django contrib autenticazione url percorso di inclusione:

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')), 

E poi, nella vostra applicazione di Cartella templates/registration, crea lo password_reset_html_email.html con qualunque modello HTML desideri.

La ragione per questo sembrava necessaria laici nella sorgente per django/contrib/auth/views.py, che ha la funzione di visualizzazione del percorso URL originale viene mappato:

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 

Il html_email_template_name è impostato come predefinito None, e non ci ha fatto sembra essere un modo per assegnare il suo valore, oltre a riscrivere questo specifico percorso per questo caso come ho detto sopra.

Speriamo che questo aiuti senza dover copiare e incollare un po 'di codice quasi identico come alcune delle altre risposte suggerite - il feedback è benvenuto, ovviamente!

0

Per me la ricerca è stata lunga, ma la soluzione piuttosto banale. Nessun override di manipolare moduli o qualcosa del genere utilizzando Django == 1.8.6 ma dovrebbe funzionare almeno da django 1.7 in poi. Per abilitare il supporto per il formato HTML messaggi di posta elettronica in password_reset tutto quello che dovevo fare è cambiare il nome chiave modello e-mail in funzione di reset da email_template_name = 'email/password_reset_email_html.html

a

html _email_template_name =' email/password_reset_email_html.html',

così la funzione di reset apparirebbe come tale:

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

Sulla base di soluzione Cem Kozinoglu vorrei suggerire di cambiare la forma e il sovraccarico send_mail invece di salvare il metodo nel modo seguente:

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

È possibile utilizzare PasswordResetSerializer http://django-rest-auth.readthedocs.io/en/latest/configuration.html

Quindi è possibile ignorare tutte le opzioni di forma:

domain_override subject_template_name email_template_name use_https token_generator FROM_EMAIL richiesta html_email_template_name extra_email_context

nel mio caso ho appena sovrascrivo 2 puntelli

class CustomPasswordResetSerializer(PasswordResetSerializer): 

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