#更新しました
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)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。