Djandoクラスビューの fileds と form_class 属性は一方のみでOK

📕 新コースを公開しました。→クーポン掲載ページ

Udemyで公開しているDjangoコースの一つで Djangoのクラスビューにおけるクラス変数、fieldsform_class について質問をいただいた内容について、ここでご紹介いたします。

質問としては

SignupViewにはfieldsがなくて、AccountUpdateViewにはfieldsがあるのはなぜでしょうか?

というような内容のものでした(言葉は一部省略しています)。

該当のコードは以下です。

# 該当箇所のみ抜粋

class SignUpView(CreateView):
    form_class = UserCreationForm  # この属性
    success_url = '/login/'
    template_name = 'pages/login_signup.html'
    ...

...

class AccountUpdateView(LoginRequiredMixin, UpdateView):
    model = get_user_model()
    template_name = 'pages/account.html'
    fields = ('username', 'email',)  # この属性
    success_url = '/account/'
    ...

正直にお伝えすると、コース作成から現時点で大分日が経っていて、こちらになぜそうしたのかを覚えていませんでした。

ということで、調べ直してみると、

公式ドキュメントにもしっかり記載されていました。

The fields attribute works the same way as the fields attribute on the inner Meta class on ModelForm. Unless you define the form class in another way, the attribute is required and the view will raise an ImproperlyConfigured exception if it’s not.
If you specify both the fields and form_class attributes, an ImproperlyConfigured exception will be raised.

つまり、form_class属性を記載しない場合はfileds属性は必須で、かつ両方指定はできない、ということになります。

form_classではforms.pyなどで作成したクラスを渡します。そのクラス内でもfiledsを指定するので、重複を避けるため、どちらかだけでいいということになります。

🎓✍️コース一覧

プログラミング関係のビデオコースを提供しています。クーポンも発行していますので、ぜひ一度チェックしてみてください。

Twitter @takumafujimoto

記事を読んでいただきありがとうございます。ツイッターではプログラミング以外についてや、たまにクーポン情報もツイートしたり。。。ツイッターでもお待ちしてます。