本篇要实现这样的功能:在文章详情页增加分享文章的入口,点击后跳到分享页面,提交要发送的email地址,程序将发送邮件到相应邮箱,邮件内容是文章的链接地址。
测试邮件发送
django自带了发送邮件的功能,只需要简单的配置即可,以163邮件服务器为例:
mysite/mysite/settings.py
新增邮件服务器配置:
EMAIL_HOST = 'smtp.163.com'
EMAIL_HOST_USER = '******@163.com' # 填写你的邮件地址
EMAIL_HOST_PASSWORD = '******' # 密码
EMAIL_PORT = 25
EMAIL_USE_TLS = True
在交互环境测试发送邮件
In [1]: from django.core.mail import send_mail
In [3]: send_mail('Django mail', '通过Django发送的邮件', '发送方的邮件', ['接收方邮件'], fail_silently
...: =False)
Out[3]: 1
创建表单页面
django内置了生成表单的功能,但其默认的样式太难看了,我们结合bootstrap对表单样式进行改造
新建 mysite/blog/forms.py
from django import forms
class EmailPostForm(forms.Form):
name = forms.CharField(label='用户名', max_length=20, widget=forms.TextInput(attrs={'class': 'form-control'}))
email = forms.EmailField(label='发送方邮件', widget=forms.EmailInput(attrs={'class': 'form-control'}))
to = forms.EmailField(label='接收方邮件', widget=forms.EmailInput(attrs={'class': 'form-control'}))
comments = forms.CharField(label='推荐语', required=False,
widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 3}))
django会根据此表单模型生成相应的表单元素,并对表单提交数据进行验证
业务逻辑搭建
分享页面的由文章详情页跳转而来,且分享的是具体的某篇文章,所以必须携带文章id
据此设定分享页面的url为:http://127.0.0.1:8000/blog/id/share/
url配置
mysite/blog/urls.py
path('<int:post_id>/share/', views.post_share, name='post_share')
view层逻辑
url配置文件指定了访问入口,在view中新增分享文章的逻辑:
# ...
from .forms import EmailPostForm
from django.core.mail import send_mail
# ...
# 文章分享
def post_share(request, post_id):
# 根据id获取文章
post = get_object_or_404(Post, id=post_id, status='published')
sent = False
if request.method == 'POST':
# 提交表单
form = EmailPostForm(request.POST)
if form.is_valid(): # 验证表单数据
cd = form.cleaned_data
# 发送邮件
post_url = request.build_absolute_uri(post.get_absolute_url())
subject = '{} ({}) 推荐你阅读"{}"'.format(cd['name'], cd['email'], post.title)
message = '查看"{}" {}\n\n{} 的评论:{}'.format(post.title, post_url, cd['name'], cd['comments'])
send_mail(subject, message, '******@163.com', [cd['to']]) # 替换为你自己的163邮箱
sent = True
else:
form = EmailPostForm()
return render(request, 'blog/post/share.html', {'post': post,
'form': form,
'sent': sent})
当http请求是post方式时,post_share接收表单数据并发送邮件;否则便是展示表单样式
由于指定的html模板是blog/post/share.html, 因此需要创建此文件
新建分享页面模板
mysite/blog/templates/blog/post/share.html
{% extends "blog/base.html" %}
{% block title %}分享文章{% endblock %}
{% block content %}
{% if sent %}
<h3 class="text-success">邮件发送成功</h3>
<p>
"{{ post.title }}" 已经成功发送到 {{ form.cleaned_data.to }}.
</p>
{% else %}
<h3 class="text-info">向你的朋友推荐阅读 "{{ post.title }}"</h3>
<form action="." method="post">
{% csrf_token %}
{% for field in form %}
<div class="form-group has-errors text-danger small">
{{field.errors}}
</div>
<div class="form-group has-errors text-danger small">
</div>
<div class="form-group">
<label for="">{{ field.label }}:</label>
{{field}}
</div>
{% endfor %}
<input type="submit" value="发送邮件">
</form>
{% endif %}
{% endblock %}
详情页添加分享入口
在文章详情页新增跳转至分享页面的入口,携带文章id
mysite/blog/templates/blog/post/detail.html
{% block content %}
<!-- ... -->
<div class="alert alert-success share">
<a href="{% url "blog:post_share" post.id %}" class="text-success">推荐此文</a>
</div>
{% endblock %}
调整样式
mysite/blog/static/css/blog.css
div.share {
margin-top: 2%;
}
结果展示
http://127.0.0.1:8000/blog/2018/9/7/jiang-xue
分享页面,提交表单
邮件发送成功的提示页
查看邮件
下一节将讲解如何搭建文章评价系统。如果你感兴趣,请关注我的django2实战
文集
如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要