0
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.

DjangoのUpdateViewについて理解する

Last updated at Posted at 2023-11-12

初めに

UpdateViewクラスを使うことで、特定のモデルのレコードを簡単に更新することができます。
全体コードはこちら

UpdateViewクラス

このクラスは、SingleObjectTemplateResponseMixinクラスとBaseUpdateViewクラスを継承し、特定のオブジェクトに関連するテンプレート応答と更新処理の機能を提供します。

UpdateView
class UpdateView(SingleObjectTemplateResponseMixin, BaseUpdateView):
    template_name_suffix = "_form"

SingleObjectTemplateResponseMixinクラス

テンプレートレスポンスを生成する機能を担い、TemplateResponseMixinを継承しています。

SingleObjectTemplateResponseMixin
class SingleObjectTemplateResponseMixin(TemplateResponseMixin):
    template_name_field = None
    template_name_suffix = "_detail"

    def get_template_names(self):
        try:
            names = super().get_template_names()
        except ImproperlyConfigured:
            names = []

            if self.object and self.template_name_field:
                name = getattr(self.object, self.template_name_field, None)
                if name:
                    names.insert(0, name)

            if isinstance(self.object, models.Model):
                object_meta = self.object._meta
                names.append(
                    "%s/%s%s.html"
                    % (
                        object_meta.app_label,
                        object_meta.model_name,
                        self.template_name_suffix,
                    )
                )
            elif getattr(self, "model", None) is not None and issubclass(
                self.model, models.Model
            ):
                names.append(
                    "%s/%s%s.html"
                    % (
                        self.model._meta.app_label,
                        self.model._meta.model_name,
                        self.template_name_suffix,
                    )
                )

            if not names:
                raise

        return names

基底クラスのTemplateResponseMixinクラスを継承しており、このクラスのrender_to_responseメソッドによってレスポンスが返されます。
その際に指定するテンプレート名の取得を、get_template_namesメソッドにより取得しており、このメソッドをSingleObjectTemplateResponseMixinクラスでオーバーライドしています。

SingleObjectTemplateResponseMixinクラスについてはこちらで詳しく説明しています。
基底クラスについてはこちらで詳しく説明しています。

BaseUpdateViewクラス

更新プロセスを管理し、ModelFormMixinとProcessFormViewを継承しています。
このクラスは、特定のオブジェクトを取得し、それに基づいてフォームを表示し、更新を処理します。

BaseUpdateView
class BaseUpdateView(ModelFormMixin, ProcessFormView):

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

ここでは、基底クラスであるViewクラス(ProcessFormView)のdispatchメソッドがリクエストメソッドに対応したメソッドを返す時に実行されるメソッドが作成されています。(GETならgetメソッド、POSTならここのpostメソッドが実行される)

BaseUpdateViewクラスのget,postメソッド共に、継承しているSingleObjectMixinクラス(ModelFormMixin)のget_objectメソッドを使用して特定のオブジェクトをデータベースから取得しています。
この値がself.object属性に設定されることで、以降の更新等の処理が、このobjectをもとに行われます。

CreateViewと異なる部分は、CreateViewでは新規で作成するためself.objectがNoneになっています。

以降の説明は、DjangoのCreateViewについて理解するの項目「BaseCreateViewの継承① ModelFormMixinクラス」で説明しています。

0
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
0
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?