- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为代表账单的对象编写一个 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/
我正在阅读 http://pythonhosted.org/WTForms/但它没有在任何地方定义过滤器函数的接口(interface),就像在 Field() 构造函数的 filters= 关键字参
在我的表单中,我尝试创建一个带有选择的自定义数组字段。 自定义表单字段: class CustomField(Field): widget = TextInput() def _val
我希望使用 Flask-WTForms 制作一个输入表单,其字段根据其他字段中的内容而变化。 例如,假设有一个“输入联系人”复选框。单击该按钮后,将出现(或激活)新字段,用于输入联系人的姓名和电话号码
这是我在 StackOverflow 上的第一篇文章,大家好。 我正在开发博客应用程序来学习 Python 和 Flask,我想在 Google App Engine 上启动它。不幸的是,我在将 WT
我正在尝试将数据从我的FlaskSQLAlChemy数据库自动填充到FlaskForm。以下是我的代码片段:。我想把这种型号的产品自动填充到一种可以接受购买的形式。以下是我的表格:。这是我的路线:。最
我使用的是最新版本的 flask、wtforms 和 Flask-WTForms。 我有一个显示表单的页面,其中一个是带有选项“A”的选择框。 应用程序启动时一切正常。在另一种形式中,我添加了一条名为
我有一个非常基本的 Flask 应用程序: from flask import Flask, render_template from flask_wtf import FlaskForm from
WTForms已更新为 2.3.0有了突破性的变化。我尝试调整其他要求,例如 werkzeug.1.0.0但还没有运气。有没有人找到解决办法? 这是堆栈跟踪: Traceback (most rece
在 WTForms 中,我可以根据数据库中的数据创建自定义验证器吗? 例如,我想显示一个多选字段,用户只能根据他们的帐户类型(存储在数据库中)选择一定数量的值。 预期的行为是这样的: 如果提交了表单,
我目前正在尝试使用 Flask 构建一个简单的 Web 应用程序。有了这个,我也在使用 WTForms,但是我在从表单中获取日期信息并对其进行验证时遇到了问题。 这是表格: from flask_wt
我有一个带有用户登录系统的 flask 应用程序。我现在注意到一些与用于注册和登录网站的电子邮件地址区分大小写相关的问题。 TL;DR 问题:我如何使用 Flask 表单的小写字母并使用它来评估用户是
我要求的其实很简单。我想创建一个包含一些字段和一个提交和一个取消按钮的表单。我想使用 Flask-Bootstrap 的 quick_form 模板函数来降低模板中的开销。我的表格是这样的: from
可能有更好的方法来执行此操作,但我正在尝试使用隐藏表单在 Flask 中使用 WTForms 定义按钮。当我尝试设置值时,这些字段似乎生成了两次。一次使用默认值“”,一次使用模板中设置的值。最终,在发
是否可以在离开字段后但在提交之前验证 WTForm 字段? 例如,在输入用户名后,在用户单击提交之前,验证该字段以查看其是否可用并显示复选标记。 最佳答案 当字段更改时,执行检查并更改相邻节点中的文本
我发现 IntegerField 在为空时不验证。要重现,请复制以下 block : from flask import Flask, render_template_string from flas
我需要将一个对象从我的数据库传递到我的表单,我想从中读取默认值。我当前的代码如下所示: 我的初始化: form = EditEventForm(event) 还有我的表单类: class EditEv
我正在使用 Flask 和 Flask-WTF,我需要创建一个包含多个具有相似结构的 block (子表单)的表单(例如具有一个 SelectField 和一个 TextAreaField 的子表单)
我需要将一个对象从我的数据库传递到我的表单,我想从中读取默认值。我当前的代码如下所示: 我的初始化: form = EditEventForm(event) 还有我的表单类: class EditEv
已经看过this答案,我无法让我的自定义 WTForm 验证器接受另一个参数。 我的代码的结构是我有一个 form_create() 方法,通过以下方式调用: form = other_fil
我在 Web 应用程序中使用 Python 3.7.4 以及 Flask 1.1.1 和 WTforms 2.2.1。 我正在尝试创建DateField像这样: user_birth = DateFi
我是一名优秀的程序员,十分优秀!