烧瓶表行数据到数据库

时间:2020-09-11 11:24:32

标签: templates flask

这是我的模板代码:

 if request.method == 'POST':
            #------Invoice
     #-----Invoice details
            form = InvoiceReportEntries(request.form)
            # items = []
            for item in form.items:
                lineitem = InvoiceLineItem(description=item.description,
                                amount=item.amount,
                                invoice_id=invoice.id)
                db.session.add(lineitem)
                db.session.commit()

我的模板是:

<form method="POST">
            {{ form.hidden_tag() }}
            <table>
                <tr class="heading">
                    <td>
                        Item
                    </td>

                    <td>
                        Price
                    </td>
                </tr>
                <tr class="item">
                    <div>
                    <td>
                        <input id={{ items|length }} name="description-{{ items|length }}" required="" type="text" value="">
                    </td>
                    <td>
                        <input id={{ items|length }} name="amount-{{ items|length }}" required="" type="text" value="">
                    </td>
                        </div>
                </tr>

似乎我的提交表单无法正常运行,因为出现此错误:

sqlalchemy.exc.StatementError:(builtins.TypeError)float()参数 必须是字符串或数字,而不是'DecimalField'[SQL:INSERT INTO invoice_line_item(说明,金额,invoice_id)VALUES(?,?,?) [参数:[{'description':'','invoice_id':14,'amount': }]]

和项目的数据形式为: {'items':[{'description':'','amount':None,'id':'','csrf_token':''}],'csrf_token':'xxxx'} 但是我在模板中填充了值吗? 描述为“测试”,金额为23

此表中我将有更多的Thant行,因此我应该确定每行并将其保存在数据库中

感谢帮助

更新: 我的模特:

class InvoiceLineItem(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  description = db.Column(db.String, nullable=False)
  amount = db.Column(db.Float, nullable=False)
  invoice_id = db.Column(db.Integer, db.ForeignKey('invoice.id'), nullable=False)

  def __init__(self, description, amount, invoice_id):
    self.description = description
    self.amount = amount
    self.invoice_id = invoice_id

我的表格.py:

class InvoiceitemForm(Form):
    description = StringField('Description', validators=[DataRequired()])
    amount = DecimalField('Amount', validators=[DataRequired()])
    id = HiddenField('id')


class InvoiceReportEntries(Form):
    items = FieldList(FormField(InvoiceitemForm), min_entries=1)

1 个答案:

答案 0 :(得分:1)

我只提供快速建议,因此您还应该添加wtformsforms.py和“ Models.py”。

Hanving说您收到的错误非常明显:

sqlalchemy.exc.StatementError: (builtins.TypeError) float() argument must be a string or a number, not 'DecimalField' 

指的是什么?

就像我说的那样,我可以完全确定为什么,因为缺少一些代码快照,但是错误代码本身就是这样:

amount': <wtforms.fields.core.DecimalField object at 0x10bc52510>

这是因为您正在调用Class而不是类的实例。实际上,我想您在form.py中有“ DecimalField”,以获取更多信息--_> Here

然后我可以看到HTML,这里没有WTFORMS jinja标签,但是有一个标准的HTML Tag输入,

   <input id={{ items|length }} name="amount-{{ items|length }}" required="" type="text" value="">

所以我建议删除它并添加以下内容:

 {{ form.amount.label }}
 {{ form.amount(class='yourclass') }}

添加forms.py:而不是required =“”:

InputRequired()或DataRequired()