V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xvx
V2EX  ›  Flask

flask+wtforms 发起 post 的时候无报错,又没写入数据库是什么原因?

  •  
  •   xvx · 2017-07-14 08:46:53 +08:00 via iPhone · 2133 次点击
    这是一个创建于 2449 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天试过可以 post 成功的,后面不知道做了什么改动,今天又不行了。大佬能否指教下。
    '''Python
    #post.html 文件:
    <form
    method="post"
    action="{{ url_for('content.post', **request.args) }}"
    role="form"
    >
    <legend>说点什么吧!</legend>
    {{ form.csrf_token }}
    <div>
    {{ form.title(placeholder="标题",
    type="text",
    autofocus="true",
    spellcheck="false") }}
    </div>
    <div>
    {{ form.tags(placeholder="标签 /话题",
    type="text") }}
    </div>
    <select name="category">
    <option value="">选择分类</option>
    {% for o in form.category.choices %}
    {%- if o[2] == None -%}
    <option value="{{ o[0] }}">{{ o[1] }}</option>
    {% else %}
    <option value="{{ o[0] }}">--{{ o[1] }}</option>
    {%- endif %}
    {% endfor %}
    </select>
    <div>
    {{ form.content(placeholder="内容",
    type="text") }}
    </div>
    <button type="submit">发布</button>
    </form>

    form 文件:

    # POST 表单
    class PostForm(FlaskForm):
    title = StringField(
    'title',
    validators=[
    DataRequired()
    ])
    tags = StringField(
    'tags'
    )
    category = SelectField(
    'category',
    coerce=int
    )
    content = TextAreaField(
    'content',
    validators=[
    DataRequired()
    ])

    #路由:
    @bp.route('/post', methods=['GET', 'POST'])
    def post():
    ''' 发帖 '''
    if g.user.is_authenticated:
    form = PostForm()
    # 分类处理
    form.category.choices = [(obj.id, obj.name, obj.parent) for obj in Category.query.order_by('id')]
    if form.validate_on_submit():
    # 标签处理
    tag_list = form.tags.data.split(',')
    tags = []
    for l in tag_list:
    name = Lable.query.filter_by(name=l).first()
    if name is None:
    tags.append(Lable(name=l))
    else:
    tags.append(name.decode('utf-8'))
    # 分类处理
    category = Category.query.filter_by(id=form.category.data).first()
    posts = PostContent(p_title=form.title.data,
    p_lable=tags,
    p_content=form.content.data,
    p_category_name=category,
    is_posted=True,
    p_author=g.user.id
    )
    db.session.add(posts)
    db.session.commit()
    db.session.flush()
    # return redirect('/')
    else:
    abort(404)
    return render_template('/content/post.html', form=form)
    '''
    第 1 条附言  ·  2017-07-14 10:56:50 +08:00
    已经自己解决了。
    确实是 form.validate_on_submit()没有执行,返回了 FALSE。

    添加如下代码:
    if not form.validate_on_submit():
    print (form.errors)

    后台返回错误信息:
    {'category': ['too many values to unpack (expected 2)']}

    原来这玩意只能有两个参数。
    form.category.choices = [(obj.id, obj.name) for obj in Category.query.all()]
    form.category.choice 调整为两个参数就 OK 了。

    记录一下,后面如果有人遇到同样的情况,可以参照我的解决记录。
    6 条回复    2017-07-14 09:50:57 +08:00
    xvx
        1
    xvx  
    OP
       2017-07-14 09:09:32 +08:00 via iPhone
    默认没有缩进,补上截图。
    ![Markdown]( http://i1.buimg.com/1949/c86ff5524e2a61e7.png)
    xvx
        2
    xvx  
    OP
       2017-07-14 09:34:10 +08:00 via iPhone
    据我的猜测应该是 form.validate_on_submit()后面没有执行到,不理解为什么没有执行。
    030
        3
    030  
       2017-07-14 09:36:09 +08:00
    这种路由入口打个断点,数据库操作前打个断点就能找到问题了
    xvx
        4
    xvx  
    OP
       2017-07-14 09:38:01 +08:00 via iPhone
    添加代码验证,果然是这样:
    if not form.validate_on_submit():
    return '提交失败!'
    HypoChen
        5
    HypoChen  
       2017-07-14 09:41:31 +08:00
    form.errors 里有啥
    xvx
        6
    xvx  
    OP
       2017-07-14 09:50:57 +08:00 via iPhone
    @HypoChen
    我加了这个代码进去:
    if not form.validate_on_submit():
    return form.errors
    返回这个错误:
    builtins.TypeError
    TypeError: 'dict' object is not callable
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   939 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:58 · PVG 04:58 · LAX 13:58 · JFK 16:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.