Flask WTForms,结合 TextAreaField 和 FileField

Flask WTForms , Combining TextAreaField with FileField

我寻求帮助,我正在尝试将 TextAreaField 和 FileField 组合在一起,但我不知道该怎么做。更简单的说法是我可以 post 文本、图像或视频。

这是我的Post表格

    class PostForm(FlaskForm):
      title = StringField('Title', validators=[DataRequired()])
      content = TextAreaField('Content', validators=[DataRequired()])
      submit = SubmitField('Post')

这是我的post路线

         @posts.route('/post/new', methods=['GET', 'POST'])
         @login_required
         def new_post():
            form = PostForm()
            if form.validate_on_submit():
                post = Post(title=form.title.data, 
                                content=form.content.data, 
                                             author=current_user)
                db.session.add(post)
                db.session.commit()
                flash('Your new post has been created!', 'success')
                return redirect(url_for('main.updates'))
            return render_template('create_post.html', title='New Post', 
                                           form=form, legend="New Post")


           @posts.route('/post/<int:post_id>')
           def post(post_id):
           post = Post.query.get_or_404(post_id)
           return render_template('post.html', title=post.title, 
           post=post)

这是我的 Post 模板

        <form class="form-signin" method="POST" action="" 
        enctype="multipart/form-data">
        <legend class="border-bottom mb-4"> {{ legend }} </legend>
        {{ form.hidden_tag() }}
        <div class="form-group">
        {{ form.title.label(class="form-control-label") }}
        {% if form.title.errors %}
        {{ form.title(class="form-control form-control-lg is-invalid") }}
        <div class="invalid-feedback">
            {% for error in form.title.errors %}
            <span>{{ error }}</span>
            {% endfor %}
        </div>
        {% else %}
        {{ form.title(class="form-control form-control-lg") }}
        {% endif %}
        </div>

        <div class="form-group">
        {{ form.content.label(class="form-control-label") }}
        {% if form.content.errors %}
        {{ form.content(class="form-control form-control-lg is-invalid") 
        }}
        <div class="invalid-feedback">
        {% for error in form.content.errors %}
        <span>{{ error }}</span>
        {% endfor %}
        </div>
        {% else %}
        {{ form.content(class="form-control form-control-lg", id='editor') 
        }}
        {% endif %}
        </div>

        <div class="form-group">
            {{ form.submit(class="btn btn-outline-info") }}
        </div>
        </form>

拜托,你能 show/guide 告诉我如何将 TextAreaField 与 FileField 组合在一起,这样我就可以 post 文本或图像或视频以一种形式出现。提前致谢

以这个例子为例,并相应地编写你的逻辑。 :

烧瓶形式:

class UploadForm(FlaskForm):
    name = StringField('Name', validators=[validators.required()])
    image = FileField('Image', validators=[validators.required()])
    submit = SubmitField('Submit')

routes.py :

@app.route("/upload", methods=['GET', 'POST'])
def upload():
    form = UploadForm()
    if request.form.get('submit') == 'Submit':
        filename1 = secure_filename(form.image.data.filename)
        form.image.data.save(app.config['UPLOAD_FOLDER'] + filename1)
        url = images.url(filename1)
        post = Post(name=form.name.data, image_filename=filename1, image_url=url, author=current_user)
        db.session.add(post)
        db.session.commit()
        ...

Model.py:

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(140))
    image_filename = db.Column(db.String, default=None, nullable=True)
    image_url = db.Column(db.String, default=None, nullable=True)

还有一些配置:

# Configure the image uploading via Flask-Uploads
images = UploadSet('images', IMAGES)
configure_uploads(app, images)