1
1

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.

djangoのUpdateViewを継承したクラスで、モデルデータを関数内で取得する

Last updated at Posted at 2023-07-13

結論

self.objectで取得できます。また、UpdateViewに限らず、DetailViewなどのモデルデータを取得するものであれば使えそうです。

サンプルコード

views.py
class RecordUpdateView(UpdateView):
    """
    ビュー:更新画面
    """
    model = Record
    # ...
    
    # テンプレートに辞書データを渡す
    def get_context_data(self, *, object_list=None, **kwargs):
        """
        表示データの設定
        """
        # recordのプライマリーキーを取得する
        # モデルデータはself.objectで取得可能
        record = self.object
        kwargs['pk'] = record.pk
        return super().get_context_data(object_list=object_list, **kwargs)

    # ...

自身が起こした勘違い

この記事を投稿する前、self.modelで取得できると勘違いしていました。下記のようなコードです。

views.py
class RecordUpdateView(UpdateView):
    """
    ビュー:更新画面
    """
    model = Record
    # ...
    
    # テンプレートに辞書データを渡す
    def get_context_data(self, *, object_list=None, **kwargs):
        """
        表示データの設定
        """
        # recordのプライマリーキーを取得する
        # モデルデータはself.modelで取得できると勘違い
        # <class 'django.db.models.base.ModelBase'>の型の変数になってしまい、取得したいモデルデータではない
        record = self.model
        # 意図しない値やエラーが発生する。
        kwargs['pk'] = record.pk
        return super().get_context_data(object_list=object_list, **kwargs)

    # ...

self.modelだと想定と違う変数になり、結果として意図しない値やエラーが発生します。注意です。

以上です。

1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?