Mi sembra che django supporti solo messaggi di testo in chiaro per le e-mail di reset della password. Come posso usare template html per questo scopo?Django password_reset supporta i modelli di email html?
risposta
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()
È possibile eseguire l'override del metodo save
di django.contrib.auth.forms.PasswordResetForm
e passare il nuovo modulo come argomento alla vista password_reset
.
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!
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'))
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()
È 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',
}
- 1. Invio di email HTML in django
- 2. django-allauth email HTML non inviare
- 3. Menu di navigazione con i modelli Django
- 4. NVelocity non supporta più i modelli di stringhe?
- 5. Email template in Django
- 6. Email Django
- 7. I modelli di django non vengono visualizzati
- 8. Django plurale per i modelli
- 9. Django: Riferimento tra i modelli
- 10. Email HTML: tabelle o div?
- 11. Come utilizzare la vista incorporata 'password_reset' in Django?
- 12. Come caricare i modelli Django?
- 13. Dove si trovano tutti i modelli di email Magento?
- 14. Come vengono analizzati i modelli di Django?
- 15. Rendi rigorosi i modelli di django
- 16. Usando `issubclass()` con i modelli di Django
- 17. Macro in modelli di Django
- 18. test Django email backend
- 19. come inviare email HTML
- 20. Digestione email Django
- 21. gmail html email background
- 22. L'API di Email Message UWP di Win 10 supporta un corpo HTML?
- 23. Cartelle di modelli Django
- 24. Django Custom User Email Verifica account
- 25. Come convalidare i modelli angolari HTML
- 26. Backbone.js separa i modelli dal file html
- 27. Come rendering HTML con i modelli angolari
- 28. django: escludere i modelli dalle migrazioni
- 29. Come rimuovere i modelli da django?
- 30. Django - Foreman non trova i modelli installati
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. –