【发布时间】:2020-05-29 14:57:49
【问题描述】:
我被困在这个问题上,我不确定是什么问题。我在用户和地址之间有多对多的关系。我正在尝试创建一个页面来显示用户的所有地址,并且可以将用户重定向到另一个页面以编辑他们的地址信息。为此,我有两条路线,用户路线仅显示地址,并将 address_id 提供给处理更新信息的 edit_address。
我不断收到此错误:
sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 1 - probably unsupported type.
[SQL: UPDATE addresses SET updated_at=?, address=?, country=?, city=?, post_code=? WHERE addresses.id = ?]
[parameters: ('2020-05-27 19:39:33.594937', ('testing',), ('gb',), ('london',), ('lo346bd',), 1)]
(Background on this error at: http://sqlalche.me/e/rvf5)
我的模特:
class TimestampMixin(object):
created_at = db.Column(db.DateTime, nullable=False,
default=datetime.utcnow)
updated_at = db.Column(db.DateTime, onupdate=datetime.utcnow)
user_addresses = db.Table('user_addresses',
db.Column("user_id", db.Integer, db.ForeignKey(
"users.id")),
db.Column("address_id", db.Integer, db.ForeignKey("addresses.id")))
class User(db.Model, TimestampMixin, UserMixin):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
(...)
# relationships (many to many)
address = db.relationship("Address", secondary="user_addresses", backref="user", lazy="dynamic")
def __repr__(self):
return f"User('{self.username}')"
class Address(db.Model, TimestampMixin):
__tablename__ = "addresses"
id = db.Column(db.Integer, primary_key=True)
address = db.Column(db.String(200), nullable=False)
country = db.Column(db.String(100), nullable=False)
city = db.Column(db.String(100), nullable=False)
post_code = db.Column(db.String(100), nullable=False)
def __repr__(self):
return f"Address('{self.id}', '{self.address}', '{self.country}', '{self.post_code}')"
我的模板:
<div class="container custom-bg my-4">
<form method="POST" enctype="multipart/form-data" class="py-4">
{{form.csrf_token()}}
<div class="form-group col-12">
{{render_field(form.address , class="form-control",placeholder="Enter your street address")}}
{% for error in form.errors.address %}
<div class="text-danger">{{error}}</div>
{% endfor %}
</div>
<div class="form-group col-12">
{{render_field(form.city , class="form-control",placeholder="Enter your city")}}
{% for error in form.errors.city %}
<div class="text-danger">{{error}}</div>
{% endfor %}
</div>
<div class="form-group col-12">
{{render_field(form.country , class="form-control",placeholder="Enter your country")}}
{% for error in form.errors.country %}
<div class="text-danger">{{error}}</div>
{% endfor %}
</div>
<div class="form-group col-12">
{{render_field(form.post_code , class="form-control",placeholder="Enter your post code")}}
{% for error in form.errors.post_code %}
<div class="text-danger">{{error}}</div>
{% endfor %}
</div>
<div class="form-row justify-content-center">
{{render_field(form.submit, class="btn btn-block btn-secondary")}}
</div>
</form>
</div>
我的看法
@ app.route("/profile/settings/edit_address/<address_id>", methods=["POST", "GET"])
@ login_required
def edit_address(address_id):
addresses = Address.query.filter_by(id=address_id).first()
form = UpdateAddressForm(obj=addresses)
form.populate_obj(addresses)
if form.validate_on_submit():
# Update address
addresses.address = form.address.data.lower(),
addresses.city = form.city.data.lower(),
addresses.post_code = form.post_code.data.lower(),
addresses.country = form.country.data.lower(),
db.session.commit()
flash("You have updated your address!", "success")
return redirect(url_for("user_settings"))
return render_template("edit_address.html", title="Update Address", form=form)
【问题讨论】:
-
这是错误信息的范围还是还有什么?
-
我一直坚持这一点,我发现了类似的问题,但没有一个适用于我的问题,我尝试了几件事但没有任何效果,我相信我得到一个元组表单数据,但我不知道为什么。
-
从堆栈跟踪中,您的输入之一似乎是错误的类型。您是否尝试过检查输入类型以确保它符合您的模型?如果这仍然不能解决它,并且你有一个可重现的项目的 git。我可以克隆并进一步调试@LucasGomes
-
每行末尾的逗号创建元组,应该删除它们。
标签: python flask sqlalchemy jinja2