WTForms设置值

问题描述 投票:0回答:1

我需要通过 Jinja 模板引擎将讨论 id 发送到 WTForms 表单,但我不明白如何做到这一点

我想传递一个变量的值,只是不输出带大括号的文本。

                <div style="background-color:black; border: solid white 1px; ">
                    <form action="{{ url_for('discussions.creating_discussion') }}" method="POST">
                        <div>
                            {{ form.hidden_tag() }}
                            {{ form.title() }}
                        </div>
                        <div style="margin-top: 10px;">
                            {{ form.hidden_tag() }}
                            {{ form.text({{ discussion.text }})  }}
                        </div>
                        <div>
                            {{ form.hidden_tag() }}
                            {{ form.submit() }}
                        </div>

形式

class DiscussionForm(FlaskForm):
    title = StringField("Title", validators=[DataRequired()], render_kw={"class": "form-title",
                                                                         "placeholder": "Введите заголовок"})
    text = StringField("Text", validators=[DataRequired()], render_kw={"class": "form-text",
                                                                       "placeholder": "Ваше сообщение"},
                       widget=TextArea())
    submit = SubmitField("Create", render_kw={"class": "btn btn-success"})

查看

@blueprint.route("/community/discussions/<int:discussion_id>/update", methods=["POST", "GET"])
@login_required
def update_discussion(discussion_id):
    discussion = Discussions.query.filter(Discussions.id == discussion_id)
    if request.method == "POST":
        form = DiscussionForm()
        if form.validate_on_submit():
            discussion.title = form.title.data
            discussion.text = form.text.data
            try:
                db.session.commit()
            except:
                flash("Произошла ошибка")
            return redirect(url_for("community.community_page"))
        else:
            for field, errors in form.errors.items():
                for error in errors:
                    flash(f"Ошибка в поле: {getattr(form, field).label.text} - {error}")
    else:
        form = DiscussionForm()
        return render_template("discussions.html", discussion=discussion, form=form)
flask flask-sqlalchemy flask-wtforms
1个回答
0
投票

我不确定我是否能够从您的问题中正确理解您的意图或您的问题是什么。

要使用数据库中对象的数据填充表单,您只需将其传递到端点内表单的

obj
属性即可。对象的适当属性用于填充同名的表单字段。

@blueprint.route('/community/discussions/<int:discussion_id>/update', methods=['GET', 'POST'])
@login_required
def update_discussion(discussion_id):
    discussion = Discussions.query.get_or_404(discussion_id)
    form = DiscussionForm(request.form, obj=discussion)
    if form.validate_on_submit():
        form.populate_obj(discussion)
        db.session.commit()
        flash("Произошла ошибка")
        return redirect(url_for('community.community_page'))
    return render_template('discussions.html', **locals())

我还注意到表单的 action 属性中的 URL 与路由不匹配。我认为由于您尝试将表单发送到从中获取表单的同一路径,因此不需要操作属性。如果你还想指定,可以将讨论对象的

id
作为参数传递给
url_for

顺便说一句,隐藏的表单字段只需要集成一次。

<form action="{{ url_for('discussions.update_discussion', discussion_id=discussion.id) }}" method="POST">
    {{ form.hidden_tag() }}
    <div>
        {{ form.title.label() }}
        {{ form.title() }}
        {% if form.title.errors -%}
            <ul>
                {% for error in form.title.errors -%}
                <li>{{ error }}</li>
                {% endfor -%}
            </ul>
        {% endif -%}
    </div>
    <div>
        {{ form.text.label() }}
        {{ form.text() }}
        {% if form.text.errors -%}
            <ul>
                {% for error in form.text.errors -%}
                <li>{{ error }}</li>
                {% endfor -%}
            </ul>
        {% endif -%}
    </div>
    <div>
        {{ form.submit() }}
    </div>
</form>
© www.soinside.com 2019 - 2024. All rights reserved.