Djangoモデル 、 Djangoモデルフォーム を作ろう¶
Djangoモデル を作ろう¶
設計しよう で作ったテーブル設計を元に Djangoモデル を定義しましょう。
guestboard/models.py
from django.db import models
class Posting(models.Model):
name = models.CharField(
max_length=64,
verbose_name='名前',
help_text='あなたの名前を入力してください',
)
message = models.CharField(
max_length=255,
verbose_name='メッセージ',
help_text='メッセージを入力してください',
)
created_at = models.DateTimeField(
auto_now_add=True,
verbose_name='登録日時',
)
基本的には今までのチュートリで書いた通りのModelになりますが、 verbose_name と言うパラメーターが増えています。 この後つくるModelFormで使われるパラメーターになるので、忘れずに書いて下さい。
注釈
Modelを定義したり変更した時は、忘れずにマイグレーションを行いましょう
(venv)$ python mysite/manage.py makemigrations
(venv)$ python mysite/manage.py migrate
Djangoモデルフォーム を作ろう¶
Djangoフォームを使ってみよう では django.forms.Form クラスを親クラスとしていましたが、Djangoには django.forms.ModelForm と言う Modelクラスを元にFieldを自動的に生成してくれるクラスが存在します。登録や更新処理ではModelFormクラスを使う方が良いでしょう。
注釈
FormとModelFormの使い分けは?と言う疑問が出ると思いますが、私は検索で使う入力項目はFormを、
登録・更新で使う入力項目はModelFormを使うようにしています。
今回のケースではあまりModelFormクラスのメリットを感じ無いと思いますが、ModelFormは
validationを行う時にユニーク制約のチェックも行う為、複雑なModelになるほどModelFormが便利になります。
guestboard/forms.py を追加して、ModelFormを定義します。
from django import forms
from .models import Posting
class PostingForm(forms.ModelForm):
class Meta:
model = Posting
fields = ('name', 'message')
widgets = {
'name': forms.TextInput(attrs={'size': 40}),
'message': forms.Textarea(attrs={'cols': 80, 'rows': 20})
}
Metaクラス に定義されている変数の意味は以下の表を参考にしてください。
変数名 | 意味 |
---|---|
model | 紐付けるModelクラスを指定します |
fields | Modelから入力フォームを生成する対象のフィールドをタプル形式で指定します。
使わないフィールドを定義する excludes と言う変数も存在します。
excludesを使う場合は fieldsを削除して 、 excludes=(『created_at』,) と書くことが出来ます。
|
widgets | 画面表示に使用するウィジェットを指定します。未指定の場合、デフォルトで設定されているウィジェットが使われます。 |