DjangoのUpdateViewについて理解する

## 初めに
UpdateViewクラスを使うことで、特定のモデルのレコードを簡単に更新することができます。
全体コードは[こちら](https://github.com/django/django/blob/main/django/views/generic/edit.py)

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

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

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

```python: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クラスについては[こちら](https://qiita.com/ryoutancobu/items/ec7b0395da8b54b5d52a)で詳しく説明しています。
基底クラスについては[こちら](https://qiita.com/ryoutancobu/items/c7f446a1f2e8e901fcee)で詳しく説明しています。

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

```python: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について理解する](https://qiita.com/ryoutancobu/items/ec7b0395da8b54b5d52a)の項目「BaseCreateViewの継承① ModelFormMixinクラス」で説明しています。