【问题标题】:why isn't my if statement working?为什么我的 if 语句不起作用?
【发布时间】:2017-07-08 03:40:26
【问题描述】:

我需要用户输入来保存到数据库,然后在应用程序上显示。 如果用户的输入为空,我需要显示一条错误消息。

我遇到了显示错误消息的问题。 当用户输入为空白时,将空白帖子保存到数据库中,然后显示没有内容而不是显示错误消息。

我正在使用 Python、Jinja2、Flask、HTML

谢谢!!

    if request.method == 'POST':

        blog_title = str(request.form['title'])
        blog_body = str(request.form['body'])

        title_error = ''
        body_error = ''

        if len(blog_title) == 0:
            title_error = 'Please give your blog a title'
            return title_error

        if len(blog_body) == 0:
            body_error = "Please give your blog some content"
            return body_error
        else:
            new_blog = Blog(blog_title, blog_body)
            db.session.add(new_blog)
            db.session.commit()

            blog_id = new_blog.id

            return redirect(url_for('blogs', id=blog_id))

    else:
        return render_template('/newpost_form.html')

【问题讨论】:

  • 你返回的是一个空字符串 (title_error),不是吗?
  • @patrick 他重新定义了 return 之前的字符串。不过,老实说,他真的根本不需要将其定义为''
  • @pstatix 我认为你是对的,也是第一个 if 应该跟一个“elif”,对吧?
  • @patrick 也是如此
  • @DamianLattenero 你是说if request.method吗?不可以直接去else。但是,如果您在谈论if len(blog_title) 后跟if len(blog_body),是的,第二个if 应该是elif。拥有两个 if 语句意味着程序将同时检查它们(理论上,return 是一个独特的替代方案)。

标签: python flask jinja2


【解决方案1】:

我会考虑整合Flask-WTF。我只这样做烧瓶形式。提供大量验证工具,使其易于使用

forms.py

from flask_wtf import FlaskForm
from wtf.fields import StringField, TextAreaField, SubmitField
from wtf.validators import DataRequired

class NewBlogForm(FlaskForm):
    title = StringField('Title', validators=[DataRequired(message='one')])
    body = TextAreaField('Body', validators=[DataRequired(message='two')])
    submit = SubmitField('Save')

routes.py

from forms import NewBlogForm

@app.route('/newpost', methods=['GET', 'POST'])
def new_post():
    form = NewBlogForm()
    if form.validate_on_submit():
        blog = Blog(form.title.data, form.body.data)
        db.session.add(blog)
        db.session.commit()  # should have try block to catch any errors
        return redirect(url_for('blogs', id=blog.id))
    return render_template('newposts_form.html', form=form)

newposts_form.html

<form>
    <ul>
    {% for error in form.errors %}
        <li>{{ error }}</li>
    {% endfor %}
    </ul>
    {{ form.csrf_token }}
    {{ form.title.label }}{{ form.title }}
    {{ form.body.label }}{{ form.body }}
    {{ form.submit }}
</form>

如果您使用的是 Flask-Bootstrap,它们支持 wtf forms 并以非常干净的方式显示错误。

【讨论】:

    【解决方案2】:

    您正在重新调整变量的值,请执行以下操作:

    if request.method == 'POST':
    
        blog_title = str(request.form['title'])
        blog_body = str(request.form['body'])
    
        if len(blog_title) == 0:
            return 'Please give your blog a title'
        elif len(blog_body) == 0:
            return "Please give your blog some content"
        else:
            new_blog = Blog(blog_title, blog_body)
            db.session.add(new_blog)
            db.session.commit()
    
            blog_id = new_blog.id
    
            return redirect(url_for('blogs', id=blog_id))
    
    else:
        return render_template('/newpost_form.html')
    

    【讨论】:

    • 尝试此操作后,我收到要显示标题的错误消息(但是,由于某种原因,它位于新页面上)。我没有收到正文的错误消息,它会将没有正文的填充标题保存到我的数据库中..
    • @TJH 好吧,那是另一个问题,你不能返回一个字符串作为我的例子,我以为你也把它们作为例子......你必须为每个案例渲染另一个模板跨度>
    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多