gpt4 book ai didi

python - 使用 datetime.date 填充 WTForms 表单对象

转载 作者:太空狗 更新时间:2023-10-30 02:47:14 28 4
gpt4 key购买 nike

我正在为代表账单的对象编写一个 crud 接口(interface),例如水费单、电费单等。

我正在使用 sqlalchemy 来处理数据,使用 wtforms 来处理表单,并使用 flask 来提供它。

这是我的路由的样子,它提供了用于编辑现有账单的表单:

@app.route('/edit_bill/<int:bill_id>', methods = ['GET'])
def edit_bill(bill_id):
s = Session()
bill = s.query(Bill).filter_by(id=bill_id).first()
form = BillForm(obj=Bill)
return render_template('edit_bill.html', form = form)

我使用 wtforms 将账单对象传递给 BillForm 构造函数,确保代表要编辑的账单的数据填充到表单中。

这就是它窒息的地方。这是异常(exception)情况:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Bill.date_due has an attribute 'strftime'

现在,我已经深入 python shell 并查询了一张账单,以确保 date_due 上有一个 datetime.date 对象,确实如此。我使用 Jinja 来构建我的前端,所以我研究了创建一个模板过滤器,但我不知道它如何与 wtforms 一起工作,而且看起来 sqlalchemy 无论如何都是令人窒息的。

那它有什么作用呢?我非常有信心我只需要弄清楚如何将那个 datetime.date 对象变成一个字符串,但我不确定该怎么做。

暂停。谢谢!

编辑:这是 BillForm 类:

class BillForm(Form):
id = HiddenField()
name = TextField(u'Name:', [validators.required()])
pay_to = TextField(u'Pay To:',[validators.required()])
date_due = DateField(u'Date Due:',[validators.required()])
amount_due = IntegerField(u'Amount Due:', [validators.required()])
date_late = DateField(u'Late After:',[validators.required()])
amount_late = IntegerField(u'Late Amount:', [validators.required()])
date_termination = DateField(u'Termination Date:',[validators.required()])

还有映射类:

class Bill(Base):
__tablename__ = 'bills'

id = Column(Integer, primary_key=True)
name = Column(String)
pay_to = Column(String)
amount_due = Column(Integer)
date_due = Column(Date)
amount_late = Column(Integer)
date_late = Column(Date)
date_termination = Column(Date)

def __init__(self, name, pay_to, amount_due, date_due, amount_late, date_late, date_termination):
self.name = name
self.pay_to = pay_to
self.amount_due = amount_due
self.date_due = date_due
self.amount_late = amount_late
self.date_late = date_late
self.date_termination = date_termination

def __repr__(self):
return "<Bill ('%s', '%s', '%s', '%s')>" % (self.name, self.pay_to, self.amount_due, self.date_due)

最佳答案

啊,我花了一些时间才弄清楚你哪里出错了,但我想我已经找到了。这是您的代码:

@app.route('/edit_bill/<int:bill_id>', methods = ['GET'])
def edit_bill(bill_id):
s = Session()
bill = s.query(Bill).filter_by(id=bill_id).first()
form = BillForm(obj=Bill)
return render_template('edit_bill.html', form = form)

现在,如果传递一个类作为 obj BillForm 中的 kwarg,表单会填充各种奇怪的对象。例如,如果我复制你所做的并检查 form.date_due.data , 它说它是一个 <sqlalchemy.orm.attributes.InstrumentedAttribute at 0x277b2d0>目的。正如错误消息中所述,此对象没有 strftime属性。

因此,您的错误在您提供的代码的第 5 行。如果您想用第 4 行中检索到的账单对象的详细信息填充表单,请将第 5 行替换为 form = BillForm(obj=bill) .如您所见,“微妙”的区别是 bill 中的小写 b。我复制了您的代码,相信应该可以解决问题。

如果您有兴趣,这就是我通常制作编辑 View 的方式。

@app.route('/edit_bill/<int:bill_id>', methods = ['GET', 'POST'])
def edit_bill(bill_id):
s = Session()
bill = s.query(Bill).filter_by(id=bill_id).first()
form = BillForm(request.form, obj=bill)
if request.method == 'POST' and form.validate():
form.populate_obj(bill)
s.add(bill)
s.commit()
# Do some other stuff, for example set a flash()
return render_template('edit_bill.html', form = form)

我有一段时间没有使用 SQLAlchemy,所以我可能在那里犯了一些错误。希望这可以帮助!如果这回答了您的问题,请“接受”答案。

关于python - 使用 datetime.date 填充 WTForms 表单对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16672028/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com