教材の内容に関係のない質問や教材とは異なる環境・バージョンで進めている場合のエラーなど、教材に関係しない質問は推奨していないため回答できない場合がございます。
その場合、teratailなどの外部サイトを利用して質問することをおすすめします。教材の誤字脱字や追記・改善の要望は「文章の間違いや改善点の指摘」からお願いします。
このパートでは、商品詳細画面に表示するレビュフォームを作成していきます。
ここではdjangoが用意しているModelFormクラスを継承して、独自フォームを作成することにします。
ModelFormクラスは、モデルを指定することで、そのモデルのフィールドを紐づいたフォームを自動的に生成してくれるクラスになり、モデルと密接に紐づくフォームを作成する際に非常に便利です。
アプリフォルダ内のforms.pyを修正していきます。
Copied!techpit/
amazon/
├ static/
├ fixtures/
├ __init__.py
├ apps.py
├ models.py
├ forms.py ← 修正
├ views.py
├ admin.py
├ migrations/
└ test.py
forms.pyに以下を追加しましょう。
amazon/forms.py12345678910111213 Copied!## 中略 ##
class ReviewForm(forms.ModelForm):
class Meta:
model = Review
exclude = ('user', 'product')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs['class'] = 'form-control'
field.widget.attrs['placeholder'] = field.label # placeholderにフィールドのラベルを入れる
self.fields['rating'].widget.attrs['style'] = 'display:none'
Metaクラスにて紐づけるモデルを指定し、excludes
にはフォームに含めない項目を指定しています(外部参照しているユーザモデルやその時参照している商品モデルについてはユーザに入力はさせないので省いています)。
また__init__
関数の最後に、rating
フィールドのウィジットを非表示にしていますが、これは、評価の星をつける部分はフォームが生成するものではなく、外部のJSの部品を用いるように実装するためです。
以上で今回のパートは終了です。
お疲れ様でした。