72
89

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】ふと、お問い合わせフォームを作りたくなったら

Last updated at Posted at 2020-03-04

はじめまして。
普段はWebサービスの開発をしてます。

はじめに

先日、ふと、お問合わせフォームを用意したくなり、
さらに、その内容を自身のメールアドレス宛に送信したくなったので、
Pythonで実装しました。

全体像

本記事では、Djangoを使用します。
Djangoとても便利です。

本文を追加.png

フォーム定義

フォーム定義はforms.pyで行います。

基本的には、Django標準機能をインポートして作ります。

加えて、フォームの項目を定義します。
「名前」、「連絡先」、「お問い合わせ内容」みたいなやつですね。
各項目の必須設定や文字制限も定義できます。

サンプルコード
# Django標準機能を import
from django import forms
from django.core.mail import BadHeaderError, send_mail
from django.http import HttpResponse
# Django設定をimport
from django.conf import settings


class ContactForm(forms.Form):
    # フォーム項目として"お名前"を定義
    name = forms.CharField(
        label='',
        max_length=100,
        widget=forms.TextInput(attrs={
            'class': 'form-control',
            'placeholder': "お名前",
        }),
    )
    # フォーム項目として"メールアドレス"を定義
    email = forms.EmailField(
        label='',
        widget=forms.EmailInput(attrs={
            'class': 'form-control',
            'placeholder': "メールアドレス",
        }),
    )
    # フォーム項目として"お問い合わせ内容"を定義
    message = forms.CharField(
        label='',
        widget=forms.Textarea(attrs={
            'class': 'form-control',
            'placeholder': "お問い合わせ内容",
        }),
    )

    # メールを送信する
    def send_email(self):
        subject = "お問い合わせ"
        message = self.cleaned_data['message']
        name = self.cleaned_data['name']
        email = self.cleaned_data['email']
        from_email = '{name} <{email}>'.format(name=name, email=email)
        # 受信者リストを指定
        recipient_list = [settings.EMAIL_HOST_USER]
        try:
            send_mail(subject, message, from_email, recipient_list)
        except BadHeaderError:
            return HttpResponse("無効なヘッダが検出されました。")

処理定義

処理の定義はviews.pyで行います。

こちらも、Django標準機能をインポートして作ります。

加えて、上記のフォーム定義もインポートします。
また、表示させる HTML遷移する URLなどを指定します。

サンプルコード
# Django標準機能をimport
from django.urls import reverse_lazy
from django.views.generic import TemplateView
from django.views.generic.edit import FormView

# forms.py からフォーム定義をimport
from .forms import ContactForm

# submitイベントの挙動を定義
class ContactFormView(FormView):
    # 表示させる html を指定
    template_name = 'contact_form.html'
    # form.py で定義したクラス名を指定
    form_class = ContactForm
    # 遷移後のurlを引数で指定
    success_url = reverse_lazy('contact_result')

    # メールを送信
    def form_valid(self, form):
        form.send_email()
        return super().form_valid(form)

# フォーム送信後の挙動を定義
class ContactResultView(TemplateView):
    # 表示させる html を指定
    template_name = 'contact_result.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['success'] = "お問い合わせは正常に送信されました。"
        return context

画面定義

お問い合わせ画面 と お問い合わせ送信後の画面 を用意します。

お問い合わせ画面では{{ form.as_p }}を使って、
フォーム定義で定義した項目を<p>タグでレンダリングします。

お問い合わせ画面
contact_form.html
<h4>お問い合わせ</h4>
  <div>
    <p><br>必要事項を入力して下さい。</p>
    <form method="POST">{% csrf_token %}
      {{ form.as_p }}
      <button type="submit" class="btn">送信</button>
      <a href="{% url 'top' %}">トップに戻る</a>
    </form>
  </div>
</div>
お問い合わせ送信後の画面
contact_result.html
<div>
  <p>
    お問い合わせ 送信完了
  </p>
  <div>
    <p>
      お問い合わせありがとうございました。<br>
      内容を確認のうえ、回答させて頂きます。
    </p>
    <a href="{% url 'top' %}">トップに戻る</a>
  </div>
</div>

URL定義

urls.pyURL と処理の紐付けを定義します。

サンプルコード
# 処理クラスをimport
# <PROJECT_NAME>は自身のプロジェクト名
from <PROJECT_NAME>.views import ContactFormView, ContactResultView

urlpatterns = [
    # ...
    path('contact/', ContactFormView.as_view(), name='contact_form'),
    path('result/', ContactResultView.as_view(), name='contact_result'),
]

メール情報定義

最後に、settings.py でプログラムで使用するメール情報を定義します。
SMTPサーバーやポート番号、ユーザー情報を指定します。

サンプルコード
EMAIL_HOST = 'smtp.XXX.com'
EMAIL_PORT = XXX
EMAIL_HOST_USER = 'XXX@XXX.com'
EMAIL_HOST_PASSWORD = 'XXX'
EMAIL_USE_TLS = True

まとめ

Django標準機能を使用することで、簡単にお問い合わせフォームが作成できました。
ふと、お問い合わせフォームを作りたくなった時の参考になれば幸いです。

72
89
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
89

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?