forms.pyには大きく分けて4つの役割があるんです。今回は4つの役割とforms.pyを使ってWebアプリを作ってみましょう。
forms.pyはなにに使うのか?
・forms.pyを使う場面
- 会員登録
- お問い合わせ
- Webサイトへ来てくれた人に入力/選択してもらうとき
- Webサイトへ来てくれた人からの情報をデータ保存したいとき
【簡単】forms.pyってどうやって作るのか?
・forms.pyを表示する流れは6ステップ
- Djangoアプリを作成
- forms.pyを作成・編集
- views.pyを編集
- htmlファイルを編集
- urls.pyを編集
- ローカルサーバーを起動して確認
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ステップ
- models.pyにどのようなデータを入れるか定義する
- models.pyとforms.pyをつなげる
- views.pyにforms.pyをつなげる
- example.htmlを編集
- ローカルサーバーをひらいて確認
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で値を取得→保存するアプリ【チュートリアル】