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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3965閲覧

一つのformに複数のsubmitボタンが存在する時、押すボタンによって処理を分けたいのですが、上手くいきません。

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2020/06/28 09:27

編集2020/06/29 10:57

以下の様なコードがあります。

html

1<form method="POST" enctype="multipart/form-data"> 2 {% csrf_token %} 3 <div class="btn-wrap"> 4 <button class="btn-save_and_edit" type="submit" name="save_and_edit">一時保存して編集を継続</button> 5 <div class="btn-save_and_edit_loading"> 6 <img src="load.gif"> 7 </div> 8 </div> 9 {{ form|bootstrap}} 10 <div class="btn-wrap"> 11 <button class="btn-save" type="submit">投稿</button> 12 <div class="btn-save_loading"> 13 <img src="load.gif"> 14 </div> 15 </div> 16</form>

javascript

1$(function() { 2 $('.btn-save').click(function(e) { 3 e.preventDefault(); 4 $('form').submit(); 5 $('.btn-save').hide(); 6 $('.btn-save_loading').show(); 7 }); 8}); 9 10$(function() { 11 $('.btn-save_and_edit').click(function(e) { 12 e.preventDefault(); 13 $('form').submit(); 14 $('.btn-save_and_edit').hide(); 15 $('.btn-save_and_edit_loading').show(); 16 }); 17});

css

1.btn-save_and_edit_loading { 2 display: none; 3} 4 5.btn-save_loading { 6 display: none; 7}

本来なら押すボタンによって処理を分けたいのですが、

javascript

1$('form').submit();

この指定により、1つ目のボタンをクリックしても2つ目のボタンの処理が実行されてしまいます。
この処理を分けたいのですが、どの様にすれば良いでしょうか?

ちなみに、下記記述があるか無いかでサーバーサイドで処理を分岐しています。

python

1name="save_and_edit"

python

1 def form_valid(self, form): 2 form.instance.user_id = self.request.user.id 3 post = form.save() 4 # 保存して編集を続けるボタン 5 if 'save_and_edit' in self.request.POST: 6 return redirect('post:post_update', pk=post.id) 7 else: 8 return redirect('post:create_done')

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

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

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

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

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

m.ts10806

2020/06/28 09:30

{{ form|bootstrap}} なんのテンプレートエンジンでしょうか。
退会済みユーザー

退会済みユーザー

2020/06/28 09:32 編集

わかり辛くて大変申し訳ないです。python、djangoによるものです。
m.ts10806

2020/06/28 09:34

欲しいアドバイスの方向性にあわせたほうが良いかと思います。 HTML,JavaScriptで欲しいなら存在しない記述はやめて、ブラウザに出力されたHTMLを提示すべきだし、サーバーサイドでの処理も意識したいならタグに追加し、質問にも前提を記載すべきです。
miyabi_takatsuk

2020/06/28 09:36

一応、python、djangoの質問タグも追加しておきましょう。 (そのHTMLが最終である限りは、不都合に関係はなさそうではある)
退会済みユーザー

退会済みユーザー

2020/06/28 09:36

かしこまりました。 お二方、ご丁寧にありがとうございます。
guest

回答1

0

ベストアンサー

まず、HTML側で、formの送信は止めちゃいます。(jsでの処理を挟むため)
これしとかないと、意図しない送信されちゃうの防ぐのけっこうめんどうなので。

html

1<form method="POST" enctype="multipart/form-data" onsubmit="return false;"> 2<!-- 中略 --> 3</form>

で、クリックイベントは下記のようにします。

javascript

1$(function() { 2 3$('.btn-save').click(function(e) { 4 e.preventDefault(); 5 6 $('.btn-save').hide(); 7 $('.btn-save_loading').show(); 8 9 // 送信は最後にしないと、上記が実行されずに送信が発生する。(formの送信は、ページ遷移と同等と考えた方がいい) 10 $('form').submit(); 11}); 12 13$('.btn-save_and_edit').click(function(e) { 14 e.preventDefault(); 15 16 // なんやかんやの処理をする。 17 18 $('form').submit(); 19}); 20 21});

コード中にも記載しましたが、
formの送信は、基本的には、ページ遷移が行われます
action属性を省略した場合は、自身に再遷移します。→ まぁ、見た目的にはリロードと挙動は一緒)
なので、それを考慮した処理をする必要があります。

追記に対して

form要素は、form内に置いている、全てのname属性付きinput要素の内容を送信します。
つまり、二つのボタンに、name属性がついている場合、片方を押したとしても、
もう片方にもname属性がついている場合、両方の情報が送信されます。
(この仕様はしっかりと覚えてください。)
よって、HTML、JavaScriptを下記のように修正するといいでしょう。

html

1<!-- というか、submit用のボタンにnameをつけることはほとんどありません。(送信する情報として使うことがほぼない) --> 2<form method="POST" enctype="multipart/form-data" onsubmit="return false;"> 3<!-- 中略 --> 4 <button class="btn-save_and_edit" type="submit">一時保存して編集を継続</button> 5<!-- 中略 --> 6</form>

javascript

1$(function() { 2 3const formElm = $('form'); 4// formに、見えないけど情報を持つinput[type="hidden"]を追加する。 5const inputData = document.createElement('input'); 6inputData.type = 'hidden'; 7inputData.value = 'nameType'; 8 9formElm[0].appendChild(inputData); 10 11$('.btn-save').click(function(e) { 12 e.preventDefault(); 13 14 $('.btn-save').hide(); 15 $('.btn-save_loading').show(); 16 17 // inputのnameを変更。サーバー処理対象外にするために。 18 inputData.name = 'notEdit'; 19 20 // 送信は最後にしないと、上記が実行されずに送信が発生する。(formの送信は、ページ遷移と同等と考えた方がいい) 21 formElm.submit(); 22}); 23 24$('.btn-save_and_edit').click(function(e) { 25 e.preventDefault(); 26 27 // なんやかんやの処理をする。 28 29 // inputのnameを、サーバー側で判断させるために、name値を対象にする値に変更 30 inputData.name = 'save_and_edit'; 31 32 formElm.submit(); 33}); 34 35});

投稿2020/06/28 10:41

編集2020/06/29 04:15
miyabi_takatsuk

総合スコア9555

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

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

退会済みユーザー

退会済みユーザー

2020/06/28 11:57

アドバイスありがとうございます。 クリックされるボタンで遷移先をサーバーサイドで分けてるからなのか、いまいち上手くいかないです。 いろいろ調べてみます!!
退会済みユーザー

退会済みユーザー

2020/06/28 12:28

もし何か分かったらで良いので、追記していただけると助かります!!
miyabi_takatsuk

2020/06/28 14:12 編集

> クリックされるボタンで遷移先をサーバーサイドで分けてるからなのか そんなの質問本文に書いてないので、こちらではわかりません。 後出しせずに、仕様をしっかり質問本文に記載して下さい。 でないと解決に導ける回答なんてできっこありません。 というか、何がどう上手くいかないんですか? 送信先のサーバーサイドの構文も併せて記載して下さい。
退会済みユーザー

退会済みユーザー

2020/06/28 23:43

お手数並びに大変失礼な事をしてしまい申し訳ございませんでした。 質問文に追記致しました。
退会済みユーザー

退会済みユーザー

2020/06/29 10:48

この度はご丁寧にありがとうございます。 また、私の不手際でご迷惑をお掛けしました。 また、もう一つ情報が不足していたのですが、nameのsave_and_editによって、サーバーサイド側で条件分岐し、リダイレクト先を決めていたのですが、この点についてもう少し考えてみます。
miyabi_takatsuk

2020/06/29 10:51

ん? 回答の後半のコードだとそのような条件分岐になりませんか? もし、そうならば、Python側のコードも記述いただかないと、こちらではいかんともしがたいです。
退会済みユーザー

退会済みユーザー

2020/06/29 10:58

お手数ばかりで申し訳ございません。 遷移先がよくわからない場所になってしまってます????
退会済みユーザー

退会済みユーザー

2020/06/29 11:32

参考までにpythonコードも載せてみました。
miyabi_takatsuk

2020/06/30 04:00

Pythonコードを細かく検証して、何が起きているか確認して下さい。 self.request.POST の中がどうなっているかを、 print関数などを使って確認してください。
退会済みユーザー

退会済みユーザー

2020/06/30 10:25

お世話になっております。 ボタンをクリックすると、一時保存の場合は、 search/?q=&save_and_edit=nameType へ、 保存の場合は、 search/?q=&notEdit=nameType へリダイレクトされてしまいます。 引き続き調査を続けます。
miyabi_takatsuk

2020/06/30 11:31

まず、質問者さん自身が、どこで何をどう処理してるかを把握しないとどうしようもありません。 よって、今の状態で、第三者に質問して解決できる段ではありません。 しっかり、Pythonの処理も含めてどういう挙動をしているか把握してください。 そっからですね。
miyabi_takatsuk

2020/06/30 11:34

inputに指定した、valueとnameが、リダイレクト先のURLに入っているので、そこがヒントになるかと。
退会済みユーザー

退会済みユーザー

2020/06/30 13:54

ご丁寧にありがとうございました。 後は自分で色々と調べてみます。 非常に助かりました。
退会済みユーザー

退会済みユーザー

2020/06/30 13:58

一点確認なのですが、ボタンをinputでは無く、buttonで記述しているのは関係ありますかね? <button class="btn-save" type="submit">投稿</button>
miyabi_takatsuk

2020/06/30 14:06

ありません。 type="submit"を指定していますので、 送信する役割のみ持ちます。 また、その定義だと、nameもvalueもありませんので、 form送信時には情報を持ちません。
退会済みユーザー

退会済みユーザー

2020/06/30 14:08

了解致しました。 ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問