質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

2065閲覧

Django View(UpdateView)の挙動について

Madai

総合スコア29

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

1クリップ

投稿2020/08/30 07:27

編集2020/08/30 12:37

DjangoでWebアプリを作成しており、
削除ボタンを押した際に、DBのis_enabledフィールドの値がFalseで更新される処理を実装しています。
実装している中で、下記の疑問が浮かびました。
認識に間違いがないでしょうか。ご教示をお願いしたく存じます。

【views.py】 class DeleteView(LoginRequiredMixin, generic.UpdateView): model = Clients fields = ('is_enabled',) template_name = 'delete.html' success_url = reverse_lazy('client:list') def form_valid(self, form): delete_value = form.save(commit=False) delete_value.is_enabled = False delete_value.save() messages.success(self.request,'削除が完了しました。') return super().form_valid(form) def form_invalid(self, form): messages.error(self.request,'削除ができませんでした。') return super().form_invalid(form)

【自己認識内容、疑問】
・削除ボタンが押された際の挙動について、
テンプレートでaction=""が指定されていなくてもDeleteViewクラスが動くのは、同クラスのtemplate_name変数で指定されている為、Djangoで挙動を制御してくれている。

【delete.html】 <form method="post"> {% csrf_token %} <p>削除しますか?</p> <button type="submit">削除</button> </form>

・form_validメソッドが動作するタイミングは、エラーがない状態で、指定したテンプレート(template_name = 'delete.html')からのpostリクエストを受け取った際に実行されている。

・form_validメソッドの引数formは、fields変数で指定したフィールドを指している。(fields変数ではなくform_class変数を指定している場合はそちらが対象となる)

・データベースが更新されるタイミングはsave()メソッドが実行されたタイミングである。
save()の記述がなく、明示化されていない場合は、form_validメソッドが実行されたタイミングで更新されており、親クラスで暗黙的にsave()メソッドが実行されている。

・特定のDBフィールドを更新するだけの処理を記述する方法はこういったコーディングが一般的か(もっとシンプルな記述方法はないでしょうか)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以前にDjangoを使っていた程度ではあるのですが、
コードリーディングがてらソースを追いつつの回答となります

・削除ボタンが押された際の挙動について、

template_nameは関係なくて、

  • formタグにactionの指定がない場合、ブラウザはその時のURLをそのままFormの送信先として使う
  • DjangoのClass-based viewをそのままルーティング設定をしている場合、URLは同じになる

といった、構造によって生まれるものだったと思います。

・form_validメソッドが動作するタイミングは、エラーがない状態で、指定したテンプレート(template_name = 'delete.html')からのpostリクエストを受け取った際に実行されている。

あっていると思います。

 ※回答のために確認した、内部的な動きの参考用URL

・form_validメソッドの引数formは、fields変数で指定したフィールドを指している。

あってはいるかと思います。fieldsが定義されている場合、fieldsから組み立てたformオブジェクトを作成しているみたいです。

 ※回答のために確認した、内部的な動きの参考用URL

・データベースが更新されるタイミングはsave()メソッドが実行されたタイミングである。

あっているみたいでした。
UpdateView は中でModelFormMixinを継承しており、継承先でform_validを定義してにない場合はModelFormMixinで定義されている処理がされます。
(中では、フォームのsave()メソッドを実行しています)

 ※回答のために確認した、内部的な動きの参考用URL

・特定のDBフィールドを更新するだけの処理を記述する方法はこういったコーディングが一般的か(もっとシンプルな記述方法はないでしょうか)

最近Djangoを触っていたわけではなく、その前提での回答になるのですが、
自分も似たような実装をしていました。ので、一般的といえば一般的と言えそうな気がします。

もしくは、「viewsに極力ロジックを載せない」という観点で、今回のケースだと
Clientsからis_enableを無条件でFalseを指定するモデルフォームを作り、viewはそのフォーム処理をするだけ」
とすると、views.py自体の見え方はシンプルになるのかなとは思いました。

 ※参考になりそうなドキュメント

投稿2020/08/30 14:13

attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Madai

2020/08/31 10:11

曖昧な理解のままにしておきたくなかったので、 不明点の解消、確信になりまして、とても助かりました。ありがとうございます。 参考先も用意していただき、調べる方法まで、参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問