AttributeError: 'TemplateResponse' object has no attribute 'is_bound'

django Exception Published at Feb. 15, 2025, 3:29 p.m. by admin@senrigan.org

定期的にやってくる、「リリースノートをちゃんと読め」と思わされる出来事

4.2をベースに解説しているDjangoの本のコードを5.1で動かしていてたら通らないテストがあって、

response = self.client.post(reverse_lazy('...'))
self.assertFormError(response, 'form', 'title', 'This field is required.')
AttributeError: 'TemplateResponse' object has no attribute 'is_bound'

Copilotに聞いたらそりゃresponseオブジェクトはTemplateResponseだからform属性ないからでしょって言うから、responseオブジェクト調べたら確かにTemplateResponseでHttpResponseオブジェクトじゃなかった。

なんでTemplateResponse渡してんだろと思ってソースコードみたら、4.1と5.1でシグネチャが変わってた。

stable/5.1.x

    def assertFormError(self, form, field, errors, msg_prefix=""):

stable/4.2.x

    def assertFormError(self, response, form, field, errors, msg_prefix=""):

リリースノートにもちゃんと書いてある。 Django 5.0 リリースノート

でもvscodeは

(method) def assertFormError(
    response: HttpResponse,
    form: str,
    field: str | None,
...

って言うし、5.1使ってるの知ってるんだから5.1の提示してくれてもいいと思うけど。