django2實戰5.建立表單及傳送郵件
本篇要實現這樣的功能:在文章詳情頁增加分享文章的入口,點選後跳到分享頁面,提交要傳送的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實戰
文集
如果覺得本文對你有所幫助,點個贊,或者賞杯咖啡錢,你的認可對我很重要