从post请求返回空数组

时间:2014-10-23 08:07:21

标签: python flask wtforms flask-wtforms

我正在尝试从我的表单中传递一些动态值,但到目前为止我只获得空值。 我有一个自动完成插件,我从JSON对象中搜索“名称”,每次我选择一个他们将传递到value="the ID"的列表。

我在WTForms找不到无序列表,所以我使用的是SelectMultipleField,因为它可以将多个值作为数组/列表传递

我的表单类看起来像这样:

class ClassForm(Form):
    function_name      = StringField('names')
    studentid          = SelectMultipleField('studentid')
    submit             = SubmitField('submit')

然后在我的模板中我就像这样使用它

<form id="function_search_form" method="post" action="">
  {{ form.csrf_token }}

  {{form.function_name.label()}}
  {{form.function_name()}}

  <!-- then I am not using studentid directly, 
       but just normal html, so each time you pass 
       in a name from the json object it will come in like this. 
  -->
 <ol class='student-list'>
    <li value="1" name="studentid" id="studentid">test</li>
 </ol>

 {{ form.submit()}}
</form>

我的问题是它不会从列表中获取值,即使我直接硬编码值,而不是jquery脚本。

以下是我的观点的样子

@app.route('/index', methods=['GET', 'POST'])
def index():
    form = ClassForm()
    if request.method == 'POST' and form.validate_on_submit():
        flash('valid form')
        st = form.studentid.data
        print(st)#debug
    return render_template('index.html', form=form)

我每次提交时都会打印form.studentid.data我收到[],这是一个空列表。

即使我尝试传递单个值并将studentid设为StringField,我仍然会获得空值。

我也试过request.form['studentid'],但后来我收到错误请求我做错了什么,是否有其他方式传递“自定义”值?

1 个答案:

答案 0 :(得分:1)

它不起作用的原因是因为<li>不是表单控件,所以它的数据不会随表单请求一起发回。

您永远不会从表单类中呈现studentid字段,因此永远不会呈现表单控件。这就像期待以下工作:

<form>
   <p name="foo" data="hello">This should be sent</p>
   <input type="submit">
</form>

要将数据恢复到view方法,您需要使用表单控件 - 您可以像这样测试它:

<form id="function_search_form" method="post" action="">
  {{ form.csrf_token }}

  {{form.function_name.label()}}
  {{form.function_name()}}

  <select name="studentid" class='student-list'>
    <option value="1">test</option>
  </select>

 {{ form.submit()}}
</form>

或者,只需正确渲染字段:

<form id="function_search_form" method="post" action="">
  {{ form.csrf_token }}

  {{form.function_name.label()}}
  {{form.function_name()}}
  {{form.studentid.label()}}
  {{form.studentid}}

  {{ form.submit()}}
</form>