1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

フォームを作ったつもりなのにUnknown field(s) (yyy) specified for XXXが出てしまった時の対処法

Posted at

概説

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間で同じフィールド名を使う。

エラー例

models.py
class XXX(models.Model):
    title = models.CharField(...)
    content = models.CharField(...)
    photo = models.ImageField(...)

forms.py
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文で回しているためパッと見わかりにくく注意が必要です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?