0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Django】問い合わせフォームの実装

Posted at

はじめに

Django を使用して転職用のポートフォリオに問い合わせ機能を追加したので、備忘録としてこの記事を作成しました。どなたかの参考になれば嬉しいです。


実装

1. プロジェクトとアプリの作成

まず、Django プロジェクトと問い合わせアプリを作成します。

django-admin startproject inquiry_sample
cd inquiry_sample
python manage.py startapp contact

2. settings.py の設定

問い合わせアプリを追加

inquiry_sample/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'contact',  # 問い合わせアプリ
]

メール送信の設定

Gmail を使用する場合
inquiry_sample/settings.py
# メール送信の設定
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "your_email@gmail.com"
EMAIL_HOST_PASSWORD = "your_app_password"
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

EMAIL_HOST_PASSWORD には Gmail のアプリパスワード を設定する必要があります。発行手順は以下のリンクを参考にしてください。

Outlook を使用する場合
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.office365.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "your_email@outlook.com"
EMAIL_HOST_PASSWORD = "your_app_password"
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

Outlook の アプリパスワード を使用する必要があります。取得方法は公式ヘルプを参照してください。

Microsoft アプリパスワードの取得方法


3. forms.py の作成

contact/forms.py
from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(label="お名前", max_length=100)
    email = forms.EmailField(label="メールアドレス")
    subject = forms.CharField(label="件名", max_length=100)
    message = forms.CharField(label="メッセージ", widget=forms.Textarea)
    send_copy = forms.BooleanField(label="自分にも送信する", required=False)

4. views.py の作成

contact/views.py
from django.shortcuts import render, redirect
from django.core.mail import EmailMessage
from django.http import HttpResponse
from django.conf import settings
from .forms import ContactForm

def contact_form(request):
    if request.method == "POST":
        form = ContactForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data["name"]
            email = form.cleaned_data["email"]
            subject = form.cleaned_data["subject"]
            message = form.cleaned_data["message"]
            send_copy = form.cleaned_data["send_copy"]

            full_message = f"お名前: {name}\nメールアドレス: {email}\n\nメッセージ:\n{message}"
            recipients = [settings.EMAIL_HOST_USER]
            if send_copy:
                recipients.append(email)

            try:
                email_message = EmailMessage(
                    subject=subject,
                    body=full_message,
                    from_email=settings.EMAIL_HOST_USER,
                    to=recipients,
                    headers={"Reply-To": email},
                )
                email_message.send()
            except Exception as e:
                return HttpResponse(f"メール送信中にエラーが発生しました: {e}")

            return redirect("contact:complete")
    else:
        form = ContactForm()

    return render(request, "contact/contact_form.html", {"form": form})

def complete(request):
    return render(request, "contact/complete.html")

5. urls.py の設定

contact アプリの URL をプロジェクトのルートに設定

inquiry_sample/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("contact.urls")),
]

contact_formとcompleteページのurlを設定

contact/urls.py
from django.urls import path
from . import views

app_name = "contact"

urlpatterns = [
    path("", views.contact_form, name="contact_form"),
    path("complete/", views.complete, name="complete"),
]

6. テンプレートの作成

問い合わせフォームのテンプレート

contact/templates/contact/contact_form.html
<h2>お問い合わせフォーム</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">送信</button>
</form>

送信完了のテンプレート

contact/templates/contact/complete.html
<h2>お問い合わせありがとうございました。</h2>
<p>メッセージが送信されました。</p>
<a href="{% url 'contact:contact_form' %}">戻る</a>

7. 動作確認

サーバーを起動し、http://127.0.0.1:8000/ にアクセスしてフォームをテストします。

python manage.py runserver

問い合わせページにテスト情報を入力して送信

スクリーンショット 2025-03-16 102148.png

送信が成功しました

「送信完了」画面が表示され、フォームの送信処理が正常に完了しました。
スクリーンショット 2025-03-16 102325.png

Gmail でメールを確認

問い合わせフォームで入力した情報がメールとして受信されました。受信者(サイト管理者)はフォームの内容を正しく確認できています。
スクリーンショット 2025-03-16 102403.png

送信元もメールを確認

送信者にも確認メールが届きましたが、Gmail の迷惑メールフォルダに分類されたようです...
スクリーンショット 2025-03-16 102625.png


まとめ

Django を使って問い合わせフォームを実装しました。実際に運用する際は、エラーハンドリングやスパム対策も検討するとよいでしょう。

最後まで読んでいただき、ありがとうございました!

参考

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?