【问题标题】:Flask WTF (Python) Size-varying list of lists of fields not working (unbound error)Flask WTF(Python)大小不同的字段列表列表不起作用(未绑定错误)
【发布时间】:2016-02-10 20:47:24
【问题描述】:

我正在尝试制作一个不确定性计算器,我需要可变数量的字段(这是最终的想法)。但是,在测试 1 个字段的数量时,我遇到了一个问题。而不是在页面中呈现字段,而是在其位置上只有一些随机代码:

我尝试检查问题是否与他们具有相同名称“值”或其他内容有关,但似乎不是问题所在。我不知道该尝试什么了。

forms.py

from flask.ext.wtf import Form
from wtforms import StringField, BooleanField, DecimalField
from wtforms.validators import DataRequired

class Receiver(Form):
    expression = StringField('expression', validators=[DataRequired()])
    # ve_list = [[StringField('expreson'), DecimalField('expression', places=10)], [StringField('expreson'), DecimalField('expression', places=10)]]
    # remember_me = BooleanField('remember_me', default=False)

    ve_list = [[DecimalField('value', validators=[DataRequired()]), DecimalField('value', validators=[DataRequired()])]]

views.py:

from flask import render_template, flash, redirect
from app import app
from .forms import Receiver
@app.route('/login', methods=['GET', 'POST'])
def login():
    form = Receiver()
    return render_template('request.html', 
                           title='Calculate',
                           form=form)

request.html:

{% block content %}
  <h1>Error propagation calculator</h1>
  <form action="" method="post" name="login">
      {{ form.hidden_tag() }}
      <p>
          Please enter the expression:<br>
          {{ form.expression }}<br>
      </p>
          Enter the value and respective error:<br>
          {% for ve in form.ve_list %}
          {{ ve[0] }} +/- {{ ve[1] }}<br>
          {% endfor %} 
      <p><input type="submit" value="Calculate"></p>
  </form>
{% endblock %}

【问题讨论】:

  • 我认为您正在寻找的是:stackoverflow.com/a/18267539/1051404 此外,如果您继续 irc 寻求帮助并与人互动,如果您没有立即得到答复,请不要离开。

标签: python python-3.x flask field flask-wtforms


【解决方案1】:

字段是类,需要调用才能运行它们的 call 方法,该方法会将 html 呈现到您的页面。

示例 1:

{{ form.expression() }}

您的字段正在呈现,但最好正确调用该字段。

已编辑:

您的字段列表不起作用,因为您需要将实例化类附加到表单类属性。当您像这样加载字段时,它是一个 UnboundField。

我建议在您的视图中动态添加字段。你可以看到这个问题的答案here

【讨论】:

  • 嗯,这是有道理的,但是即使没有双亲,form.expression 也会呈现(与我有相同的结果)。当我尝试像您一样将它们添加为“ve”时,我得到:“AttributeError:'UnboundField' object has no attribute 'call'”
  • @allg18,我假设这是因为我的索引已关闭。我看到第一个字段是列表中的一个列表,所以它可能需要是 ve[0][0] 或类似的东西。
  • 我认为不是,因为“ve_list”是一个列表的列表,而我使用“for ve in form.ve_list”,所以每个ve都是一个DecimalFields的列表,它有两个元素长(并且我用 ve[0] 和 ve[1]) 调用它们
  • 好的,很抱歉。问题是在将列表添加到表单时,您会得到一个 UnboundField。 wt-forms 很可能需要实例化一个字段类并将其分配给表单类的属性。你的所作所为可能行不通。看到这个答案:stackoverflow.com/questions/16406496/…
  • @allg18,您能否将此标记为已回答 b/c 我相信我解决了您的问题?
【解决方案2】:

作为表单一部分的字段需要是表单类的类变量。如果它们不是,那么 WTForms 将不会找到它们,因此它们永远不会绑定到表单。

如果要添加字段列表,可以通过设置 Form 类的属性来实现。像这样的:

class Receiver(Form):
    expression = StringField('expression', validators=[DataRequired()])

setattr(Receiver, 've_list0', DecimalField('value', validators=[DataRequired()]))
setattr(Receiver, 've_list1', DecimalField('value', validators=[DataRequired()]))

然后在模板中,可以对表单域进行迭代渲染,而不是一一渲染。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多