首页 > 解决方案 > “FloatField”类未定义“__truediv__”

问题描述

当我尝试获取用于计算的“身高”和“体重”变量​​的值时,在第 8 行出现错误:

'Class 'FloatField' 没有定义 ' truediv ',因此不能在其实例上使用 '/' 运算符。此检查检测应解析但未解析的名称。由于动态调度和鸭子类型,这在有限但有用的情况下是可能的。比实例项目更好地支持顶级和类级项目。

这些表单用于存储到数据库(持久性/搁置)并显示所有值。我已经能够存储和显示“身高、体重和身份证”变量,但我在尝试添加“bmi”变量时陷入了困境。

from wtforms import Form, StringField, validators, SubmitField, 
FloatField


class AddRecordForm(Form):
    id = StringField('User', [validators.DataRequired()])
    height = FloatField('Height in meters (e.g 1.75)', [validators.Length(min=4, max=4), validators.DataRequired()])
    weight = FloatField('Weight in kilograms', [validators.Length(min=1), validators.DataRequired()])
    bmi = weight/height*height
    submit = SubmitField("Update/Add your Health Information")

我想要做的是使用变量'height'和'weight'的输入值来计算'bmi'

标签: pythonpython-3.xflask-wtforms

解决方案


表单提供最高级别的 API。它们包含您的字段定义、委托验证、接受输入、汇总错误,并且通常用作将所有内容粘合在一起的粘合剂。

为了从表单中获取输入并在应用程序中使用它,您需要在模板中呈现表单实例并在视图函数部分中计算值。

from wtforms import Form, StringField, validators, SubmitField,  FloatField


class AddRecordForm(Form):
    id = StringField('User', [validators.DataRequired()])
    height = FloatField('Height in meters (e.g 1.75)', [validators.Length(min=4, max=4), validators.DataRequired()])
    weight = FloatField('Weight in kilograms', [validators.Length(min=1), validators.DataRequired()])

    submit = SubmitField("Update/Add your Health Information")

#Some thing like this must be your View function part

from flask import flash, redirect, url_for, session, render_template
app = Flask(__name__)
@app.route('/bmi', methods=['GET', 'POST'])
def bmi():
    form = AddRecordForm()
    if form.validate_on_submit():
        height = form.height.data
        weight = form.weight.data
        bmi = weight/height*height
        #Do database operations here
    for field, errors in AddRecordForm().errors.items(): 
        for error in errors: 
           flash(u"Error in the %s field - %s" % (getattr(form, field).label.text, 'error')) 

    return render_template('bmi.html', form=form)

现在在目录bmi.html内的模板中将您templates的表单呈现为:

 <form action="" method="post">
    {{ form.hidden_tag() }}
     <p>
        {{ form.id.label }}<br>
        {{ form.id }}
    </p>
    <p>
        {{ form.height.label }}<br>
        {{ form.height }}
    </p>
    <p>
        {{ form.weight.label }}<br>
        {{ form.weight}}
    </p>

    <p>{{ form.submit }}</p>
</form>

推荐阅读