【问题标题】:flask + wtforms nameerror烧瓶 + wtforms 名称错误
【发布时间】:2014-02-23 11:35:06
【问题描述】:

flask + wtforms

您好,我在将数据传输到表单时遇到了一些问题

def edit_comment(n): 
    idlist = str(n)  
    if (r.exists('entries:%s' %idlist) != True):
        return abort(404)
    if 'user_id' not in session:
        return abort(401)    
    if (g.user['group_access'] == '1'):
        return abort(403)
    form = EditForm(idlist)
    return render_template('edit_comment.html',idlist = idlist, r = r, form = form)

...

class EditForm(Form):
    edit_title = TextField("Title",validators = [Required()] ,default =r.hget('entries:%s' %idlist, 'title'))
    edit_text = TextAreaField("Text",validators = [Required()],default =r.hget('entries:%s' %idlist, 'text'))

...

Traceback (most recent call last):
  File "run.py", line 129, in <module>
    class EditForm(Form):
  File "run.py", line 130, in EditForm
    edit_title = TextField("Title",validators = [Required()] ,default =r.hget('entries:%s' %idlist, 'title'))
NameError: name 'idlist' is not defined

这里有明显的数据传输问题。试图通过构造函数,但目前没有结果

【问题讨论】:

  • foo != True?嗯。请按照 PEP8 中的建议使用not foo

标签: flask wtforms


【解决方案1】:

您需要在EditForm 实例上设置默认值。现在它在导入时设置 - 显然不是您想要的,即使变量已定义。实际上,您甚至不需要 default 字段 - 直接设置即可:

form = EditForm()
form.edit_title.data = r.hget('entries:%s' % idlist, 'title')
form.edit_text.data = r.hget('entries:%s' % idlist, 'text')
return render_template('edit_comment.html', idlist=idlist, r=r, form=form)

注意:通常最好让视图函数具有类似于以下的结构:

form = EditForm()
if form.validate_on_submit():
    # do whatever should be done on submit, then redirect somewhere
    return redirect(...)
elif request.method == 'GET':
    # Populate the form with initial values
    form.edit_title.data = ...
    form.edit_text.data = ...
return render_template(..., form=form)

这样,用户输入的任何内容都会被保留,以防验证失败,但如果他第一次打开表单,它会填充您想要的任何默认数据(例如,您的数据库中的当前值)。

【讨论】:

  • 非常感谢。你帮了我很多
猜你喜欢
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2016-05-03
  • 1970-01-01
  • 2016-01-23
  • 2019-02-10
相关资源
最近更新 更多