Flask WTForms, объединение TextAreaField с FileField - PullRequest
0 голосов
/ 26 февраля 2020

Я прошу помощи, я пытаюсь объединить TextAreaField и FileField вместе, но я не знаю, как это сделать. Проще сказать, я могу публиковать тексты, изображения или видео.

Это мой PostForm

    class PostForm(FlaskForm):
      title = StringField('Title', validators=[DataRequired()])
      content = TextAreaField('Content', validators=[DataRequired()])
      submit = SubmitField('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)

Это мой шаблон сообщения

        <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>

Пожалуйста, можете Вы показываете / объясняете, как объединить TextAreaField с FileField, чтобы я мог публиковать текст, изображения или видео в одной форме. Заранее спасибо

1 Ответ

0 голосов
/ 26 февраля 2020

Возьмите этот пример и напишите логин c соответственно. :

Flask форма:

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

rout.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)
...