【入門】Django/forms.pyの理解しやすい使いかた【Windows】
「Django使い始めたはいいけど、forms.pyって使いどころわからん...」

forms.pyには大きく分けて4つの役割があるんです。今回は4つの役割とforms.pyを使ってWebアプリを作ってみましょう。

forms.pyはなにに使うのか?

・forms.pyを使う場面

  • 会員登録
  • お問い合わせ
  • Webサイトへ来てくれた人に入力/選択してもらうとき
  • Webサイトへ来てくれた人からの情報をデータ保存したいとき

【簡単】forms.pyってどうやって作るのか?

・forms.pyを表示する流れは6ステップ

  1. Djangoアプリを作成
  2. forms.pyを作成・編集
  3. views.pyを編集
  4. htmlファイルを編集
  5. urls.pyを編集
  6. ローカルサーバーを起動して確認

Step1: Djangoアプリを作成

最初に、コマンドプロンプトを開き次のコードを入力。

1. example_pというプロジェクトを作成

> django-admin startproject example_p

2. example_pディレクトリに移動

> cd example_p

3. example_appというアプリを作成

example_p> python manage.py startapp example_app

これでexample_appという名前のアプリケーションを作成完了。

Step2: forms.pyファイルを作成・編集

1. Djangoのアプリケーションフォルダ内に移動

example_p> cd example_app

2. forms.pyを作成

example_p\example_app> type nul > forms.py

3. forms.pyを編集

from django import forms


class ExampleForm(forms.Form):
    name = forms.CharField(max_lenght=20)

これでforms.pyにnameというフォームが作成完了。文字の長さは20文字が上限。

Step3: views.pyを編集

・ views.pyを編集しviews.pyとforms.pyをつなげる

from .forms import ExampleForm


def example(request):
    form = ExampleForm()
    return render(request, "example_app/example.html", {"form": form})

renderのContextとよばれる場所で{"form": form}を書けば、views.pyとforms.pyをつなげられる。また、この後のhtmlファイルにもつながってる。

views.pyをもっと知りたいなら【入門】Django/views.pyの役割と書きかたで解説してるのでどうぞ。

Step4: example.htmlを作成・編集

1. example_appフォルダ内にtemplatesフォルダを作成

example_p\example_app> mkdir templates

2. teplatesフォルダに移動

example_p\example_app> cd templates

3. templatesフォルダ内にexample_appフォルダを作成

example_p\example_app\templates> mkdir example_app

4. example_appフォルダに移動

example_p\example_app\templates> cd example_app

5. example_app内でindex.htmlファイルを作成

example_p\example_app\templates\example_app> type nul > example.html

6. example.htmlファイルに次のコードを入力

<form method="post">
    {% csrf_token %}
    {{ form }}
    <button type="submit" name="submit">Submit</button>
</form>
  • HTML内のformにはmethod="post"を必ず設定する
  • buttonを押したらフォームが送信される

・method="post"?
post形式でWebにデータを送信する方法。基本的にフォームを作成する場合はセキュリティ的にpostを選択するべき。

・{% csrf_token %}って?
Cross-site Request Forgeryというもので、簡単に言えばセキュリティ対策。{% csrf_token %}を入れないとエラーに。

・{{ form }}って?
さっきviews.pyで書いた{"form": form}の左側の名前。views.pyとhtmlファイルはこれでつながる。views.pyからの値を表示するため。

Step5: urls.pyを編集

・urls.pyにexample/というURLを追加する

urlpatturn = {
    path("example/", views.example, name="example"),
}

・nameってなんで必要?
HTMLでURLを表示させたいときに使う。たとえばaタグhref属性に{% url "[名前]" %}と書くことで勝手にURLを取得。もしURLをexample/→home/に変えてもnameの変更がなければ自動で新しいURLを取得。

urls.pyについてもっと知りたいなら【入門】Django/urls.pyの書きかたとnameの使いどころで解説してるのでどうぞ。

Step6: ローカルサーバーで確認してみる

・ローカルサーバーを起動して、example.htmlを開いてみる

example_p> python manage.py runserver

URLで確認してみる: http://127.0.0.1:8000/example/

nameという入力ボックスがでてきて、Submitというボタンができましたね。これが、もっとも簡単なformsの使いかた。

本で学習本でPythonを学びたい?ならこの2冊を読めば「初心者」は卒業できるから読んでみ

おまけ: forms.pyとmodels.pyを使ってデータを保存する

models.pyとforms.pyをつなげることで保存できるようにしましょう。さっき作成した、example_pを使っていきます。

・forms.pyでデータを保存する5ステップ

  1. models.pyにどのようなデータを入れるか定義する
  2. models.pyとforms.pyをつなげる
  3. views.pyにforms.pyをつなげる
  4. example.htmlを編集
  5. ローカルサーバーをひらいて確認

Step1: models.pyにどのようなデータを入れるか定義する

・ models.pyを開いて次のコードを入力

from django import models


class ExampleModel(models.Model):
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

・どんなデータを入れてるの?

  • 名前はname
  • 文字列型(CharField)
  • 文字の最大数が20文字(max_length=20)

・def __str__ってなに?
文字列形式で出力してくれる機能。今回はnameを文字列でだしてくれる。設定しないとデータ管理するときに文字化けなどの不具合が起きる。

Step2: models.pyとforms.pyをつなげる

・forms.pyを編集する

from django.forms import ModelForm
from django.models import ExampleModel


class ExampleForm(ModelForm):

    class Meta;
        model = ExampleModel
        fields = ["name",]
  • ModelFormとさっき作ったExampleModelをインポートする
  • 8行目...model変数にさっき作ったExampleModelをいれる
  • 9行目...表示したいフォームを設定。今回はname

Step3: views.pyにforms.pyをつなげる

・views.pyを編集する

from .forms import ExampleForm
from .models import ExampleModel


def example(request):
    model = ExampleModel()
    form = ExampleForm()
    return render(request, "example.html", {"form": form, "model": model})
  • ExampleFormとExampleModelをインポートする
  • 6~7行目...ExampleFormとExampleModelをセットする
  • 8行目...HTMLで使えるように{"form": form, "model": model}をいれる

Step4: example.htmlを編集

・example.htmlを編集する

<form method="post">
    {% csrf_token %}
    {{ form }}
    <button type="submit" name="submit">Submit</button>
</form>

{% for m in model %}
    <p>{{ m.name }}</p>
{% end for %}

・{% for m in model %}って?
繰り返し処理をするために使う。大体がデータベースを表示したいとき。今回はnameをデータベースから全て出力させるため。

Step5: ローカルサーバーをひらいて確認

URLを確認する: http://127.0.0.1:8000/example/

nameボックスに何か文字を入力して、Submitを押してみましょう。文字がボックスの下に表示できましたね。これで、入力したデータがデータベースに保存が完了。

まとめ: forms.pyを使って複雑なアプリにも挑戦してみよう

・forms.pyを使う場面は4つ

  • 会員登録
  • お問い合わせ
  • Webサイトへ来てくれた人に入力/選択してもらうとき
  • Webサイトへ来てくれた人からの情報をデータ保存したいとき

基本的にforms.pyを覚えれば、けっこう複雑なWebアプリが作成可能。

データベースとつなげれば大体のアプリは作れちゃいます。forms.pyで良いアプリケーションを作ってみましょう。

・forms.pyでつくるアプリ【チュートリアル】
【Django】forms.pyで値を取得→保存するアプリ【チュートリアル】

本で学習本でPythonを学びたい?ならこの2冊を読めば「初心者」は卒業できるから読んでみ

あなた向け最短できれいなコードが書きたいならこの本を読めばいい