首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SubForms中无法使用验证器

在SubForms中无法使用验证器
EN

Stack Overflow用户
提问于 2019-07-08 15:41:57
回答 2查看 319关注 0票数 3

我的观点如下:

我有一个带有FloatFields的FieldList输入。但是这些嵌套字段中的验证器没有运行.

当我有一个基本的表单时,NumberRange工作得很好。但是,当我有一个嵌套表单时,wtforms.validators.NumberRange会触发以下错误:

TypeError:“FloatField”和“int”的实例之间不支持<

我不知道为什么会发生这种错误?

这里是我的主文件:

代码语言:javascript
复制
from flask import Flask, render_template, flash
from flask_wtf import FlaskForm
from wtforms import FloatField, SubmitField, StringField, FieldList, FormField
from wtforms.validators import NumberRange


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'

class mySubForm(FlaskForm):
    class Meta:
        csrf = False
    mySubField = FloatField(validators=[NumberRange(min=-100, max=100)])

class myForm(FlaskForm):
    myField = FieldList(FormField(mySubForm))
    mySubmit = SubmitField("Save")


@app.route('/', methods=['GET','POST'])
def home():
    form = myForm()

    xLabels = ["A", "B", "C", "D"]

    for x in xLabels:
        subForm = mySubForm()
        form.myField.append_entry(subForm)

    if form.validate_on_submit():
        flash("success")

    return render_template("draft.html", form=form)


if __name__ == "__main__":
    app.run(host="127.0.0.1", port="5000" ,debug=True)

这里是我的模板:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
  <head>
    <style>
      .error{border-color: red;}
    </style>
  </head>
  <body>
    <div>
      <form method="POST" action="/">
        {{ form.hidden_tag() }}

        {% for field in form.myField %}
          {% if field.mySubField.errors %}
            {{ field.mySubField(class="error") }}
            {% for error in field.mySubField.errors %}
              <span>{{ error }}</span>
            {% endfor %}
          {% else %}
            {{ field.mySubField.data }}
          {% endif %}
        {% endfor %}

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

      {% with messages = get_flashed_messages(with_categories=False) %}
        {% if messages %}
          {% for message in messages %}
            <p>{{ message }}</p>
          {% endfor %}
        {% endif %}
      {% endwith %}
    </div>

  </body>
</html>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-13 00:20:37

问题是append_entry不接受字段,而是接受原始数据,因此验证失败,因为它将数字与FloatField进行比较。

将它作为字段传递也是为什么您必须在模板中使用mySubField.data而不是简单的mySubField(),因为实际上,mySubField正在呈现另一个字段,即您传递它的字段。

要解决这个问题,你可以做一些类似的事情

代码语言:javascript
复制
form.myField.append_entry({'mySubField': some_number})

如前所述,这将使您也可以修复模板:

代码语言:javascript
复制
{% else %}
  {{ field.mySubField() }}
{% endif %}

顺便提一下,您可能希望将add_entry逻辑封装在一个条件中,这样它只发生在GET请求中,否则每次提交表单时都会添加新条目。

票数 2
EN

Stack Overflow用户

发布于 2019-07-15 16:05:29

感谢Luis,下面是工作代码:

我的主文件:

代码语言:javascript
复制
from flask import Flask, render_template, flash, request
from flask_wtf import FlaskForm
from wtforms import FloatField, SubmitField, StringField, FieldList, FormField
from wtforms.validators import NumberRange


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'


class myForm(FlaskForm):
    myField = FieldList(FloatField(validators=[NumberRange(min=-100, max=100)]))
    mySubmit = SubmitField("Save")


@app.route('/', methods=['GET','POST'])
def home():
    form = myForm()

    xLabels = ["A", "B", "C", "D"]

    if request.method == 'GET':
        for x in xLabels:
            form.myField.append_entry(data=42)

    if form.validate_on_submit():
        flash("success")

    return render_template("drat.html", form=form)


if __name__ == "__main__":
    app.run(host="127.0.0.1", port="5000" ,debug=True)

模板:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
  <head>
    <style>
      .error{border-color: red;}
    </style>
  </head>
  <body>
    <div>
      <form method="POST" action="/">
        {{ form.hidden_tag() }}

        {% for field in form.myField %}
          {% if field.errors %}
            <br>{{ field(class="error") }}
            {% for error in field.errors %}
              <span><br>{{ error }}</span>
            {% endfor %}
          {% else %}
            <br>{{ field }}
          {% endif %}
        {% endfor %}

        <br>{{ form.mySubmit() }}
      </form>

      {% with messages = get_flashed_messages(with_categories=False) %}
        {% if messages %}
          {% for message in messages %}
            <p>{{ message }}</p>
          {% endfor %}
        {% endif %}
      {% endwith %}
    </div>

  </body>
</html>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56938391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档