初めに
UpdateViewクラスを使うことで、特定のモデルのレコードを簡単に更新することができます。
全体コードはこちら
UpdateViewクラス
このクラスは、SingleObjectTemplateResponseMixinクラスとBaseUpdateViewクラスを継承し、特定のオブジェクトに関連するテンプレート応答と更新処理の機能を提供します。
class UpdateView(SingleObjectTemplateResponseMixin, BaseUpdateView):
template_name_suffix = "_form"
SingleObjectTemplateResponseMixinクラス
テンプレートレスポンスを生成する機能を担い、TemplateResponseMixinを継承しています。
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を継承しています。
このクラスは、特定のオブジェクトを取得し、それに基づいてフォームを表示し、更新を処理します。
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クラス」で説明しています。