概説
Modelをうまく使えるよう、特定のフィールドをFormコントロールにしようとしてdjango.core.exceptions.FieldError: Unknown field(s) (yyy) specified for XXX
が出てしまった時は、XXXのフィールドに対して、Formコントロールで扱っているfield名yyyが存在しているか確認し、どちらか一方に合わせると良いです。
環境
環境は以下の通りです。
名称 | バージョン |
---|---|
macOS | Monterey(12.1) |
django | 4.0.1 |
Python | 3.8.9 |
brew | 3.3.10 |
pip | 21.3.1 |
psycopg2-binary | 2.9.3 |
PostgreSQL | 14.1 |
対処法
models.py
で定義したフィールド名と、forms.py
で使っているフィールド名が一致(または存在)しているか確認し、一致(または存在)していない場合は書き換えてFormとModel間で同じフィールド名を使う。
エラー例
class XXX(models.Model):
title = models.CharField(...)
content = models.CharField(...)
photo = models.ImageField(...)
class XXXCreateForm(forms.ModelForm):
class Meta:
model = XXX
# ここで'content'の代わりに存在しないfieldである'overview'を入れてしまっている
fields = ('title', 'overview', 'photo')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs['class'] = 'form-control'
補足
何かの作成画面など、FormクラスからDBへ登録するような仕組みを作りたいとき、
URL->View->Form->Modelの流れを実現しようとします。ModelとFormの間で重複が多い場合はわざわざfields
を自作せず、FormModelを継承してフォームを作成した方が楽です。そういった場合に、ModelとForm間で異なったフィールド名を使おうとすると、このエラーが出力されてしまいます。上記の場合、'fields'と敢えて分離した上で、for文で回しているためパッと見わかりにくく注意が必要です。