Skip to content

Instantly share code, notes, and snippets.

@maxwellcc
Last active September 6, 2022 12:37
Show Gist options
  • Save maxwellcc/931eba376f0b044e4dfd4a627ba3ea23 to your computer and use it in GitHub Desktop.
Save maxwellcc/931eba376f0b044e4dfd4a627ba3ea23 to your computer and use it in GitHub Desktop.
Enviando emails atraves do Django, utilizando formulário
<!-- 4. Criar link no template html -->
<p>
<a href="{% url 'blog:post_share' post.id %}">Share this post</a>
</p>
# 2. Criar formulário de envio
from django import forms
class EmailPostForm(forms.Form):
name = forms.CharField(max_length=25)
email = forms.EmailField()
to = forms.EmailField()
comments = forms.CharField(required=False, widget=forms.Textarea)
# 1. Configurar email
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'log@gmail.com'
EMAIL_HOST_PASSWORD = 'senha'
EMAIL_PORT = '587'
EMAIL_USE_TLS = True
{% extends 'blog/base.html' %}
<!-- Segue o formulário de retorno ou de envio pelo formulário criado no passo 2 -->
{% block title %}Share a post{% endblock %}
{% block content %}
{% if sent %}
<h1>E-mail successfully sent</h1>
<p>
"{{ post.title }}" was successfully sent to {{ form.cleaned_data.to }}
</p>
{% else %}
<h1>Share "{{ post.title }} by e-mail"</h1>
<form method="post">
{{ form.as_p }}
{% csrf_token %}
<input type="submit" value="Sent e-mail">
</form>
{% endif %}
{% endblock %}
# 3. Criar URL
from django.urls import path
#[...]
urlpatterns = [
#[...]
path('<int:post_id>/share/', views.post_share, name='post_share')
]
# 5. Criar regra de negócio na view
def post_share(request, post_id):
# Recebe o objeto atraves do id do modelo
post = get_object_or_404(Post, id=post_id, status='published')
sent = False
# Se o formulário foi enviado via POST do formulário
if request.method == 'POST':
# Recebe a classe criada no passo 2
form = EmailPostForm(request.POST)
# Se o formulário é válido
if form.is_valid():
# Recebe os dados do formulário criado no passo 2 e submetido pelo any_template.html no passo 4
cd = form.cleaned_data
# (opcional) pega a URL do Post do blog
post_url = request.build_absolute_uri(post.get_absolute_url())
# pega os dados do formulário supracitado
subject = f'{cd["name"]} recommends you read {post.title}'
message = f'Read {post.title} at {post_url}\n\n' \
f'{cd["name"]} \'s comments: {cd["comments"]}'
# envia o e-mail
if send_mail(subject, message, 'log@gmail.com', [cd['to']]):
sent = True
# Se não foi enviado dados atraves do formulário, mas houve um simples acesso à página
else:
# Recebe o formulário em branco criado no passo 2
form = EmailPostForm()
# Retorna a página com os dados do contexto
return render(request, 'blog/post/share.html', {'post': post, 'form': form, 'sent': sent})
@maxwellcc
Copy link
Author

Os passos estão misturados, mas a sequencia se encontra no formulário. O arquivo share.html pode ser criado após o passo 5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment