【问题标题】:Flask wtforms: validate_on_submit() returns true every timeFlask wtforms:validate_on_submit() 每次都返回 true
【发布时间】:2020-05-26 10:34:52
【问题描述】:

我是编程新手,我想知道为什么 validate_on_submit() 每次都返回 True,即使表单没有填写。我正在尝试建立一个社交网站(facebook、twitter)的副本,并尝试实现一种评论、回复和喜欢帖子的方式。但是,每次我“喜欢”帖子或评论时,都会将评论的副本添加到数据库中。

这是我的代码:

在forms.py中:

from flask_wtf import FlaskForm
from wtforms import SubmitField, TextAreaField
from wtforms.validators import DataRequired

class PostForm(FlaskForm):
    content = TextAreaField("Content", validators=[DataRequired()])
    submit = SubmitField("Post")

class CommentForm(FlaskForm):
    content = TextAreaField("Comment_content", validators=[DataRequired()])
    submit = SubmitField("Comment")

class ReplyForm(FlaskForm):
    content = TextAreaField("Reply_content", validators=[DataRequired()])
    submit = SubmitField("Reply")

在 routes.py 中:

@posts.route("/post/<int:post_id>", methods=["GET","POST"])
@login_required
def post(post_id):
    comment_form = CommentForm()
    reply_form = ReplyForm()
    post = Post.query.get_or_404(post_id)
    image_file = url_for("static", filename="profile_pic" + current_user.image_file)
    comments = Post_comment.query.order_by(Post_comment.date_commented.desc()).filter_by(post_id=post_id)
    print(comment_form.validate_on_submit)
    if "post_like" in request.form:
        user_likes_post(request.form["post_like"])
    elif "comment_like" in request.form:
        user_likes_comment(request.form["comment_like"])
    elif "reply_like" in request.form:
        user_likes_reply(request.form["reply_like"])
    if comment_form.validate_on_submit:
        comment = Post_comment(content=comment_form.content.data, comment_author=current_user, post=post)
        db.session.add(comment)
        db.session.commit()
    elif reply_form.validate_on_submit:
        reply = Comment_reply(content=reply_form.content.data, reply_author=current_user)
        db.session.add(reply)
        db.session.commit()
    return render_template("post.html", post=post, comment_form=comment_form, reply_form=reply_form, image_file=image_file, comments=comments)

在 post.html 中:

{% extends "layout.html" %}

{% block content %}

<div id="post">
    <div id="post_desc">
        <img src="{{ image_file }}">
        <a>{{ post.author.username }}</a>
        {{ post.date_posted }}
    </div>   
    <div id="post_content">
        {{ post.content }}  
    </div>   
    <div>{{ post.like_count }}</div>
    <form method="POST">
        <button name="post_like" type="submit" value="{{ post.id }}" >like</button>  

        <button name="comment" type="button" href="#" >comment</button>
    </form>
</div>
<div>
    <form method="POST" action="">
        {{ comment_form.hidden_tag() }}
        {{ comment_form.csrf_token }}
        <fieldset>
            <div>
                {% if comment_form.content.errors %}
                    {{ comment_form.content() }}
                    <div>
                        {% for error in comment_form.content.errors %}
                            <span>{{ error }}</span>
                        {% endfor %}
                    </div>
                {% else %}
                    {{ comment_form.content() }}
                {% endif %}
            </div>        
        <div>
            {{ comment_form.submit() }}
        </div>
    </form>
    {% for comment in comments %}
    <div id="comment">
        <div id="comment_desc">
            <img src="{{ image_file }}">
            <a>{{ comment.comment_author.username }}</a>
            {{ comment.date_posted }}
        </div>   
        <div id="comment_content">
            {{ comment.content }}  
        </div>   
        <div>{{ comment.like_count }}</div>
        <form method="POST">
            <button name="comment_like" type="submit" value="{{ comment.id }}" >like</button>  
        </form>
    </div>
        <div>
            <form method="POST" action="">
                {{ reply_form.hidden_tag() }}
                {{ reply_form.csrf_token }}
                <fieldset>
                    <div>
                        {% if reply_form.content.errors %}
                            {{ reply_form.content() }}
                            <div>
                                {% for error in reply_form.content.errors %}
                                    <span>{{ error }}</span>
                                {% endfor %}
                            </div>
                        {% else %}
                            {{ reply_form.content() }}
                        {% endif %}
                    </div>        
                <div>
                    {{ reply_form.submit() }}
                </div>
            </form>
        </div>
        {% for reply in comment.replies %}
            <div id="reply">
                <div id="reply_desc">
                    <img src="{{ image_file }}">
                    <a>{{ reply.reply_author.username }}</a>
                    {{ reply.date_posted }}
                </div>   
                <div id="reply_content">
                    {{ reply.content }}  
                </div>   
                <div>{{ reply.like_count }}</div>
                <form method="POST">
                    <button name="reply_like" type="submit" value="{{ reply.id }}" >like</button>  
                </form>
            </div>
        {% endfor %}
    </div>
    {% endfor %}
</div>
{% endblock %}

我认为这里发生的事情是,当我“喜欢”帖子、评论或回复时,会发送一个 POST 请求,但我不确定为什么 validate_on_submit() 返回 true 以使其通过 if 语句并添加即使存在 Datarequired() 验证器,也可以进入数据库。

抱歉,如果我的代码非常混乱,我是编程新手,需要一些时间来学习最佳实践。

【问题讨论】:

    标签: python validation flask wtforms


    【解决方案1】:

    看来你可能有语法问题,

    这就是你所拥有的:

    if comment_form.validate_on_submit:
    

    这就是documentation 所说的应该使用的方式:

    if comment_form.validate_on_submit():
    

    希望对您有所帮助! :D

    【讨论】:

    • omg 现在我为一个语法错误浪费了这么多时间感到愚蠢哈哈
    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2017-10-07
    • 2015-08-21
    • 2019-02-26
    相关资源
    最近更新 更多