Me parece que django solo admite mensajes de texto sin formato para correos electrónicos de restablecimiento de contraseña listos para usar. ¿Cómo puedo usar plantillas html para este propósito?¿Django password_reset admite plantillas de correo electrónico html?
Respuesta
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()
Puede anular el método save
de django.contrib.auth.forms.PasswordResetForm
y pasar un nuevo formulario como argumento a la vista password_reset
.
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!
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'))
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()
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',
}
- 1. correo electrónico de plantillas de Django
- 2. Envío de correo electrónico HTML en Django
- 3. Zend_Translate traducción de plantillas de correo electrónico
- 4. Donde almacenar plantillas de correo electrónico
- 5. django + enviar correo electrónico en html con django-registration
- 6. Django correo electrónico
- 7. Django correo electrónico resumen
- 8. ¿Admite JavaScript un mensaje de correo electrónico?
- 9. Plantillas de correo electrónico como plantillas de scala en Play?
- 10. Estilo de correo electrónico HTML
- 11. Correo electrónico HTML: ¿tablas o divs?
- 12. cómo enviar correo electrónico HTML
- 13. Correo electrónico HTML en Outlook
- 14. Convertir html web a correo electrónico Html
- 15. Envío de resultados de correo electrónico HTML Correo electrónico que muestra código HTML (Codeigniter Email Class)
- 16. Ofuscación de correo electrónico en html
- 17. Imagen de fondo css dentro de un correo electrónico HTML - Gmail no admite
- 18. Biblioteca de plantillas de correo electrónico en Java
- 19. ¿Dónde están todas las plantillas de correo electrónico de Magento?
- 20. Django: [correo electrónico protegido] en el administrador
- 21. Django auth.user con el correo electrónico única
- 22. Crear un editor html wysiwyg para editar plantillas de correo electrónico
- 23. ¿Debo usar el marcado HTML 4.0 para mis plantillas de correo electrónico?
- 24. ¿Cómo es un correo electrónico HTML?
- 25. Enviando un correo electrónico HTML usando Swift
- 26. Correo electrónico HTML - ¿Está permitido colspan?
- 27. Correo electrónico HTML alinea el texto
- 28. Prellena un correo electrónico con contenido HTML
- 29. Enviando correo electrónico HTML usando Python
- 30. Enlace de código HTML dentro de un correo electrónico a un archivo adjunto de correo electrónico
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? –