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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Q&A

解決済

1回答

512閲覧

3つのFORMをJS→VUE.JSに書き換えたい

yuujiMotoki

総合スコア90

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

0グッド

0クリップ

投稿2020/10/26 11:02

編集2020/10/29 01:24

#更新しました

VUE側を書きました。

  • HTMLのファイルフォームからPOSTして、FlaskFormで処理したい
  • JS側のPOSTには、AJAX使いたくない(可読性がない)
  • 将来的にも、FLASK側はライブラリで処理したい

POSTの中身をみても、data:Noneで受け取れていない

VUE側でのバインディングが良く分からない

(Pdb) vars(number_form.file) {'meta': <wtforms.form.Meta object at 0x000001EA7762A0D0>, 'default': None, 'description': '', 'render_kw': None, 'filters': (), 'flags': <wtforms.fields.Flags: {}>, 'name': 'file', 'short_name': 'file', 'type': 'FileField', 'validators': (), 'id': 'file', 'label': Label('file', 'File'), 'process_errors': [], 'object_data': None, 'data': None, 'raw_data': []}

#内容
フォームで3つのファイルをPOST送信するコードを書いています。
バックエンドはFlaskで書いています。

#質問
単純に同じフォームが3つあるため、Vue.Jsでコンポーネントに書き換えたいと思います。
バリデーションは無しで、同じ機能を実装するにあたり、どこから手を付けていっていいのか
良くわかっていません。

 特にFLASK側には、form1,form2,form3というふうに、BE側で違う分岐になるように
処理を書いていますが、そもそもコンポーネントを共有化するのであれば
BE側もClassを継承するような処理をして、すっきりした方が良いのかもしれません。

 いまだVue.Js、PYTHONも十分理解できていないのですが、
やり方さえわかれば、今後の応用が出来る気がします。

 こういう同じフォームを使いまわす際の、
Vue.JsとPYTHONの書き方のお作法がありましたら、教えて頂きたく思います。
(他力本願で申し訳ありませんが、何回もチャレンジはしましたが、
いまだ乗り越えられない状態です。)

javascript

1 2<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.18/vue.min.js"></script> 3 4<!-- vue.js form --> 5<div id="app"> 6<div id="content"> 7 <div class="container-fluid"> 8 <template 9 title="ファイル1の読込" 10 form = {{form1}}     <!-- Flask側から form1 をレンダリング --> 11 > 12 </template> 13 <template 14 title="ファイル2の読込" 15 form = {{form2}}     <!-- Flask側から form2 をレンダリング --> 16 > 17 </template> 18 <template 19 title="ファイル3の読込"   <!-- Flask側から form3 をレンダリング --> 20 form = {{form3}} 21 > 22 </template> 23 </div> 24</div> 25</div> 26

javascript

1 2{% raw %} 3<script type="text/x-template" id="template"> 4 <h1>{{title}}</h1> 5 <form class="form form-horizontal" method="POST" action="{{url_for('data_import')}}" enctype="multipart/form-data"> 6 <input type="file" name="filename"> 7 {{ this.form.hidden_tag }} 8 <input type="submit" > 9 </form> 10 <hr> 11</script> 12{% endraw %} 13 14<script> 15 16Vue.component('template', { 17 template: '#template', 18 props: { 19 title : String, 20 form : Object, 21 }, 22 data: function(){ 23 return { 24 title : "", 25 hidden_tag:"" 26 }; 27 } 28 } 29) 30 31 // Vue 32new Vue({ 33 el: '#app' 34}); 35 36</script>

python

1 2from flask_wtf import FlaskForm 3 4class UploadForm(FlaskForm): 5 file = FileField() 6 7#データインポート処理 8@app.route('/import',methods=["GET", "POST"]) 9def data_import(): 10 number_form = UploadForm() 11 label_form = UploadForm() 12 xxx_form = UploadForm() 13 14 if request.method == "POST": 15 if number_form.validate_on_submit(): 16 filename = secure_filename(number_form.file.data.filename) 17 number_form.file.data.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 18 elif label_form.validate_on_submit(): 19 filename = secure_filename(label_form.file.data.filename) 20 label_form.file.data.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 21 elif xxx_form.validate_on_submit(): 22 filename = secure_filename(label_form.file.data.filename) 23 xxx_form.file.data.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 24 25 return redirect(url_for('data_import')) 26 27 return render_template( 28 'import.html',form1=number_form,form2=label_form,form3=xxx_form)

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

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

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

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

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

guest

回答1

0

自己解決

最終的にはVue.Jsは使わないことにしました。

#解決した方法
HTMLフォームとFLASKのFORM-MODEL処理について、下記の辞書を使い紐付けを行った。

JS
dict = { "title1:"db1","title2":"db2", "title3":"db3","title4":"db4" }

python
model_table = {"db1",database1,"db2":database2,"db3":database3,"db4":database4}

全体的なループカウンタは、Flask側からJINJA2でループを回して、レンダリング時にloop.index0を使いIDタグに命名している。
DOM完成後にJSでdictのループを回して(MAPのINDEXから生成)してhtmlを書き換えている。

html

1 2 {% for i in forms %} 3 <h1 id = "t{{loop.index0}}"></h1> 4 <p> 5 <form id = "f{{loop.index0}}" class="form form-horizontal" method="POST" action="{{url_for('data_import')}}" enctype="multipart/form-data"> 6 <input type="file" name="file"> 7 <input type="submit" > 8 </form> 9 </p> 10 {% endfor %} 11 12<script> 13var dict = { "title1:"db1","title2":"db2", "title3":"db3","title4":"db4" } 14 15 Object.keys(dict).map(function(key,index){ 16 document.getElementById('t'+index).textContent = key; 17 document.getElementById('f'+index).action += "/"+dict[key]; 18 }); 19</script>

python

1model_table = {"db1",database1,"db2":database2,"db3":database3,"db4":database4} 2 3#データインポート処理 4@app.route('/import') 5@app.route('/import/<model_name>',methods=["GET", "POST"]) 6def data_import(model_name): 7 if request.method == 'POST': 8 if 'file' not in request.files: 9 flash('No file part') 10 return redirect(request.url) 11 file = request.files['file'] 12 if file.filename == '': 13 flash(name + "ファイルを選択してください。", "failed") 14 return redirect(request.url) 15 if file and allowed_file(file.filename): 16 filename = secure_filename(file.filename) 17 filename =os.path.join(app.config['UPLOAD_FOLDER'], filename) 18 file.save(filename) 19 model = model_table[model_name] 20 objects = model.data_import(filename) 21 22 #new_report = Report(report_name=filename, report_welder_wps_association_id=report_id) #create a database entry with exact filename 23 #db.session.add(new_report) 24 #db.session.commit() 25 26 return render_template( 27 'table_viewer.html', 28 forms = range(4) 29 ) 30 31 return render_template( 32 'import.html', 33 forms = [1,2,3,4] 34 )

#あとがき
何故ここまで複雑化したのかというと、FLASK側の処理をURLエンドポイントで分岐したいことと、
JS側をコード変更が容易になるようにしたいため。

FLASK側で試行錯誤したが、やはりVIEWに関わる情報は、JS側で処理をしたいというのが根本にある。

投稿2020/11/04 01:22

編集2020/11/04 01:44
yuujiMotoki

総合スコア90

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問