この記事では、Djangoでのフォームの作成と処理について解説します。Djangoでのフォーム処理はWebアプリケーション開発において非常に重要な部分です。具体的なコード例とその詳細な解説、そして応用例を2つ紹介します。
目次
Djangoでの基本的なフォームの作成
Djangoにはフォームを扱うための豊富なモジュールとクラスが存在します。まずはシンプルなお問い合わせフォームを作成してみましょう。
models.pyの設定
最初にmodels.pyにてデータモデルを定義します。
from django.db import models
class Contact(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
message = models.TextField()
forms.pyの設定
次にforms.pyにてフォームを設計します。
from django import forms
from .models import Contact
class ContactForm(forms.ModelForm):
class Meta:
model = Contact
fields = ["name", "email", "message"]
ビューとテンプレートの設定
ビュー(views.py)とテンプレート(template)を設定します。
from django.shortcuts import render, redirect
from .forms import ContactForm
def contact_view(request):
if request.method == "POST":
form = ContactForm(request.POST)
if form.is_valid():
form.save()
return redirect("success_page")
else:
form = ContactForm()
return render(request, "contact.html", {"form": form})
Djangoフォームの処理とバリデーション
基本的なバリデーション
Djangoは自動的にいくつかのバリデーションを行いますが、独自のバリデーションも追加できます。
from django.core.exceptions import ValidationError
def validate_even(value):
if value % 2 != 0:
raise ValidationError("入力値は偶数である必要があります")
class MyForm(forms.Form):
even_field = forms.IntegerField(validators=[validate_even])
独自のエラーメッセージ
エラーメッセージもカスタマイズできます。
class MyForm(forms.Form):
my_field = forms.IntegerField(
error_messages={
"required": "このフィールドは必須です",
"invalid": "整数を入力してください"
}
)
応用例1: Ajaxを使用した非同期処理
非同期でフォームを送信するために、Ajaxを使った例を紹介します。
// JavaScriptコード
$("#myForm").submit(function(e){
e.preventDefault();
$.ajax({
url: "/api/form_submit/",
type: "POST",
data: $("#myForm").serialize(),
success: function(response){
alert("成功:" + response.message);
}
});
});
応用例2: ファイルのアップロード
ファイルをアップロードするフォームの作成例を紹介します。
// models.py
class UploadFile(models.Model):
file = models.FileField(upload_to='uploads/')
// forms.py
class UploadFileForm(forms.ModelForm):
class Meta:
model = UploadFile
fields = ['file']
まとめ
この記事では、Djangoでの基本的なフォームの作成から、バリデーション、応用例に至るまでを解説しました。Djangoでのフォーム処理は多機能であり、多くの場面で役立つスキルです。ぜひ実践で活用してください。
コメント