代码之家  ›  专栏  ›  技术社区  ›  Jason

通过flask bootstrap将flask wtforms验证传递给引导警报

  •  0
  • Jason  · 技术社区  · 6 年前

    这里是新的flask用户…我正在为我的flask应用程序构建一个漂亮的文件上传按钮。该按钮基本上利用wtforms来验证只能上载csv和txt文件。上传工作正常,但如何将验证错误作为引导警报传递到屏幕?例如:

    1. 按下“上传”按钮将生成“未选择文件”警报。
    2. 用jpeg按upload将生成“错误的文件格式”

    如有任何建议,我们将不胜感激!

    我的表格。

    class UploadForm(FlaskForm):
        validators = [FileRequired(message='There was no file!'),
                      FileAllowed(['csv', 'txt'], message='Must be a csv file!')]
    
        input_file = FileField('', validators=validators)
        submit = SubmitField(label="Upload")
    

    我的路由器

    @app.route('/upload', methods=['GET', 'POST'])
    def upload():
    
        form = UploadForm()
    
        if request.method == 'POST' and form.validate_on_submit():
            input_file = request.files['input_file']
    
            # Do stuff
            filename = secure_filename(input_file.filename)
    
            # save file to disk to some folder defined in a separate config file....
            data = os.path.join(SOME_UPLOAD_FOLDER, filename)
            input_file.save(data)
    
            return redirect(url_for('upload'))
    
    else:
        return render_template('upload.html', form=form)
    

    最后是html/css/js:

    {% extends "bootstrap/base.html" %}
    {% import "bootstrap/wtf.html" as wtf %}
    
    {% block html_attribs %} lang="en" charset="utf-8"{% endblock %}
    
    {% block metas %}
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
    {% endblock %}
    
    
    {% block styles %}
    
        <!-- Latest compiled and minified CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
              integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    
        <style>
            #browsebutton {
                background-color: white;
            }
    
            #my-file-selector {
                display: none;
            }
        </style>
    
    
    {% endblock %}
    
    {% block content %}
    
        <div class="container">
            <div class="jumbotron">
                <h3>File Uploader Example</h3>
    
    
                <div class="row">
                    <form class="form-inline center-block" action="/upload" method="POST" enctype="multipart/form-data">
                        {{ form.hidden_tag() }}
                        <div class="input-group">
                            <label id="browsebutton" class="btn btn-default input-group-addon" for="my-file-selector">
                                {{ form.input_file(id="my-file-selector") }}
                                Browse...
                            </label>
                            <input type="text" class="form-control" readonly>
                        </div>
                        {{ form.submit(class_="btn btn-primary") }}
                    </form>
                </div>
            </div>
        </div>
    
    {% endblock %}
    
    
    {% block scripts %}
    
        <! -- jquery -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <!-- Latest compiled and minified JavaScript -->
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
    
        <!-- pretty upload button -->
        <script>
        $(function() {
    
          // We can attach the `fileselect` event to all file inputs on the page
          $(document).on('change', ':file', function() {
            var input = $(this),
                numFiles = input.get(0).files ? input.get(0).files.length : 1,
                label = input.val().replace(/\\/g, '/').replace(/.*\//, '');
            input.trigger('fileselect', [numFiles, label]);
          });
    
          // We can watch for our custom `fileselect` event like this
          $(document).ready( function() {
              $(':file').on('fileselect', function(event, numFiles, label) {
    
                  var input = $(this).parents('.input-group').find(':text'),
                      log = numFiles > 1 ? numFiles + ' files selected' : label;
    
                  if( input.length ) {
                      input.val(log);
                  } else {
                      if( log ) alert(log);
                  }
    
              });
          });
    
        });
        </script>
    
    {% endblock %}
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   SivolcC    6 年前

    如果您正在使用wtforms,我建议您使用宏来呈现表单字段。详细说明 here 你可以举个例子 there (你可以在网上找到其他一些帮助你定制,而不是从头开始写)。

    注意,在wtform的文档中,宏 render_field() 检查字段是否有错误:

    {% if field.errors %}
      <ul class=errors>
      {% for error in field.errors %}
        <li>{{ error }}</li>
      {% endfor %}
      </ul>
    {% endif %}
    

    当然,您可以决定不使用宏,在这种情况下,您可以直接在HTML表单中使用上面的代码片段 form.input_file.errors 而不是 field.errors