前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django2实战5.创建表单及发送邮件测试邮件发送创建表单页面业务逻辑搭建新建分享页面模板详情页添加分享入口结果展示

django2实战5.创建表单及发送邮件测试邮件发送创建表单页面业务逻辑搭建新建分享页面模板详情页添加分享入口结果展示

作者头像
章鱼喵
发布2018-09-26 18:03:27
1.5K1
发布2018-09-26 18:03:27
举报
文章被收录于专栏:codingcodingcoding

继上篇 django2实战4.创建文章列表页和详情页

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

如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 测试邮件发送
  • 创建表单页面
  • 业务逻辑搭建
    • url配置
      • view层逻辑
      • 新建分享页面模板
      • 详情页添加分享入口
      • 结果展示
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档