【问题标题】:WTF Forms (Flask)- FormField - FieldList, Validation don't workWTF Forms (Flask)- FormField - FieldList,验证不起作用
【发布时间】:2016-03-04 08:00:29
【问题描述】:

我正在尝试使用 WTF 字段、FormField、FieldList 创建 ListItem 表单:

forms.py

class WarehouseTicketItemForm(Form):
      description = StringField(u'Description', validators=[Required()])
      quantity = IntegerField(u'Quantity', validators=[Required()])

class WarehouseTicketForm(Form):
      spot_id = SelectField(u'Spot', coerce=int)
      items = FieldList(FormField(WarehouseTicketItemForm), min_entries = 3)

warehouse_ticket_form.html

<form action="" method='POST'>
  {{ form.hidden_tag() }}
  {{ form.spot_id }} <br>
  {% for item in form.items %}
    {{ item }}
  {% endfor %}
 <button type="submit" name="button">Save it</button>

warehouse_tickets.py

@coordinator.route('/warehouses/tickets/update', methods=['GET', 'POST'])
def update_warehouses_tickets():
   page = dict(title="Warehouse Ticket")
   form = WarehouseTicketForm()
   form.spot_id.choices = [(s.id, s.name)
                           for s in Spot.query.filter_by(status=True)]
   if form.validate_on_submit():
       print form.data
   return render_template('coordinators/warehouses/warehouse_ticket_form.html',
                        page=page, form=form)

提交表单“print form.data”不会返回任何内容...

我不知道我错过了

【问题讨论】:

  • 您的&lt;form&gt; 标签是否正确关闭?
  • action 属性也可能需要指定实际页面。由于它似乎被重定向到当前页面,action='/'action='.' 就足够了。您不使用快速表单的任何原因?
  • 两个建议。我终于发现,对于每个新的“项目”形式,都需要一个 crsf 令牌。为此,我必须通过将 crsf 令牌设置为 False 来覆盖 WarehouseTicketItemForm 初始化函数。
  • 我一开始还以为是csrf token的问题。但是因为您使用的是hidden_tag(),所以我假设 csrf 令牌是自动生成的?

标签: flask flask-wtforms


【解决方案1】:

我会将验证作为 items 字段的参数。

class WarehouseTicketForm(Form):
    spot_id = SelectField(u'Spot', coerce=int)
    items = FieldList(FormField(WarehouseTicketItemForm), min_entries = 3, validators=[Required()])

【讨论】:

    猜你喜欢
    • 2019-05-22
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多