#困っていること
flask-wtformを利用してフォームの作成し、button要素がクリックされた際にHiddenFieldへ値を設定し、POSTするといった処理を実装したいです。(CRUDの学習の一環です)
しかし、HiddenFieldでフォームを作った場合、上手くクリック時に値を設定できていないようで、FlaskFormクラスのvalidate_on_submit()メソッドに弾かれてしました。
なおHiddenFieldではなく、StringFieldで行った際にはうまく挙動します。また<input type='hidden'>とflask-wtformを利用せずに記述した場合もうまく挙動します。
#ソースコード
上手く挙動しない場合
Python
1# import module 2from flask import Flask, render_template, session, redirect, url_for, flash, request 3from flask_wtf import FlaskForm 4from wtforms import StringField, IntegerField, SubmitField, RadioField, SelectField, HiddenField 5from wtforms.validators import InputRequired, DataRequired, NumberRange, Length, ValidationError 6from wtforms.widgets.core import HiddenInput 7from wtforms.fields.html5 import DateField 8import os 9 10#===== define app instance 11app = Flask(__name__) 12 13#===== set app.config 14app.config['SECRET_KEY'] = 'this is secret key of life sand box' 15 16#===== define Form & Fields 17class TestForm1(FlaskForm): 18 text = HiddenField('', validators = [DataRequired(message = "タスクを入力してください")]) 19 submit = SubmitField('submit') 20 21class TestForm2(FlaskForm): 22 text = HiddenField('', validators = [DataRequired(message = "タスクを入力してください")]) 23 submit = SubmitField('submit') 24 25 26#=== routing 27@app.route('/', methods = ['GET', 'POST']) 28def index(): 29 form1 = TestForm1() 30 form2 = TestForm2() 31 if form1.validate_on_submit(): 32 text1 = form1.text.data 33 return render_template('result.html', text = text1) 34 if form2.validate_on_submit(): 35 text2 = form2.text.data 36 return render_template('result.html', text = text2) 37 return render_template('index.html', form1 = form1, form2 = form2) 38 39app.run(debug = True, host = os.getenv('APP_ADDRESS', 'localhost'), port = 8001)
下記がindex.htmlになります。
HTML
1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset = "UTF-8"> 5 <title>FormTest</title> 6 <script 7 src="https://code.jquery.com/jquery-3.5.1.js" 8 integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" 9 crossorigin="anonymous"></script> 10 </head> 11 <body> 12 <main> 13 {% macro render_error(field) %} 14 {% for error in field.errors %} 15 <li class="error">{{ error }}</li> 16 {% endfor %} 17 {% endmacro %} 18 <div> 19 <form id = "form1" method="POST"> 20 {{ form1.hidden_tag() }} 21 <div><p>text1</p>{{ form1.text.label }} {{ form1.text(id = "text1") }}</div> 22 <div>{{ render_error(form1.text) }}</div> 23 <button name = "form1" name = "form1">ボタン</button> 24 </form> 25 </div> 26 <div> 27 <form name = "form2" method="POST"> 28 {{ form2.hidden_tag() }} 29 <div><p>text2</p>{{ form2.text.label }} {{ form2.text(id = "text2") }}</div> 30 <div>{{ render_error(form2.text) }}</div> 31 <button id = "form2" name = "form2">ボタン</button> 32 </form> 33 </div> 34 </main> 35 <script> 36 $(document).ready(function(){ 37 $("button[id = 'form1']").click(function() { 38 $('#text1').val("XXX") 39 $('form[name = "form1"]').attr('action', '/') 40 $('form[name = "form1"]').submit(); 41 }); 42 $("button[id = 'form2']").click(function() { 43 $('#text2').val("YYY") 44 $('form[name = "form2"]').attr('action', '/') 45 $('form[name = "form2"]').submit(); 46 }); 47 }); 48 </script> 49 </body> 50</html>
また下記がresult.htmlです。
HTML
1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset = "UTF-8"> 5 <title>FormTest</title> 6 <script 7 src="https://code.jquery.com/jquery-3.5.1.js" 8 integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" 9 crossorigin="anonymous"></script> 10 </head> 11 <body> 12 <main> 13 <h1>{{ text }}</h1> 14 </main> 15 </body> 16</html>
HiddenFieldではなく、StringFieldでフォームを作った場合は上手く行きます。
Python
1#===== define Form & Fields 2class TestForm1(FlaskForm): 3 text = StringField('', validators = [DataRequired(message = "タスクを入力してください")]) 4 submit = SubmitField('submit') 5 6class TestForm2(FlaskForm): 7 text = StringField('', validators = [DataRequired(message = "タスクを入力してください")]) 8 submit = SubmitField('submit')
何かHiddenFieldならではの制約などあるのでしょうか?
もし何かございましたらご教授いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。