内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

django2实战:创建表单及发送邮件

2018-09-11 22:03 出处:清屏网 人气: 评论(0

本篇要实现这样的功能:在文章详情页增加分享文章的入口,点击后跳到分享页面,提交要发送的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实战 文集

分享给小伙伴们:
本文标签: django2

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号