WTForms StringField 写入 Postgres 的编程错误
Programming error with WTForms StringField writing to Postgres
我的数据库是 Postgres 实例。
我的模型定义为:
from app import db
class Device(db.Model):
__tablename__ = 'device'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String())
我的发件人定义为:
from flask_wtf import FlaskForm
from wtforms import StringField
class EditDevices(FlaskForm):
device_name = StringField("Device Name", validators=[])
submit = SubmitField['Submit']
我在表格中收到一条错误消息:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'StringField' [SQL: 'UPDATE device SET name=%(name)s WHERE device.id = %(device_id)s'] [parameters: {'name': <wtforms.fields.core.StringField object at 0x110580c18>, 'device_id': 208}]
我哪里出错了?
您的代码不完整——您没有显示您实际尝试设置模型数据并将其保存到数据库的位置,但错误显示 <wtforms.fields.core.StringField object at 0x110580c18>
是您设置的值name
属性,所以你可能在做:
device = Device()
device.name = form.device_name
db.session.add(device)
db.session.commit()
这会导致类似于您看到的错误,因为 form.device_name
是 StringField
而您需要 user-submitted 数据。要从表单元素中获取数据,您需要使用 .data
属性:
device = Device()
device.name = form.device_name.data
db.session.add(device)
db.session.commit()
使用email.data数据的地方
class RegisterForm(FlaskForm):
email = StringField("Email", validators=[DataRequired(), Email()])
password = PasswordField("Password", validators=[DataRequired(),Length(min=6,max=15)])
password_confirm = PasswordField("Confirm Password", validators=[DataRequired(),Length(min=6,max=15), EqualTo('password')])
first_name = StringField("First Name", validators=[DataRequired(),Length(min=2,max=55)])
last_name = StringField("Last Name", validators=[DataRequired(),Length(min=2,max=55)])
submit = SubmitField("Register Now")
def validate_email(self,email):
user = User.query.filter_by(email=**email.data**).first()
if user:
raise ValidationError("Email is already in use. Pick another one.")
我的数据库是 Postgres 实例。 我的模型定义为:
from app import db
class Device(db.Model):
__tablename__ = 'device'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String())
我的发件人定义为:
from flask_wtf import FlaskForm
from wtforms import StringField
class EditDevices(FlaskForm):
device_name = StringField("Device Name", validators=[])
submit = SubmitField['Submit']
我在表格中收到一条错误消息:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'StringField' [SQL: 'UPDATE device SET name=%(name)s WHERE device.id = %(device_id)s'] [parameters: {'name': <wtforms.fields.core.StringField object at 0x110580c18>, 'device_id': 208}]
我哪里出错了?
您的代码不完整——您没有显示您实际尝试设置模型数据并将其保存到数据库的位置,但错误显示 <wtforms.fields.core.StringField object at 0x110580c18>
是您设置的值name
属性,所以你可能在做:
device = Device()
device.name = form.device_name
db.session.add(device)
db.session.commit()
这会导致类似于您看到的错误,因为 form.device_name
是 StringField
而您需要 user-submitted 数据。要从表单元素中获取数据,您需要使用 .data
属性:
device = Device()
device.name = form.device_name.data
db.session.add(device)
db.session.commit()
使用email.data数据的地方
class RegisterForm(FlaskForm):
email = StringField("Email", validators=[DataRequired(), Email()])
password = PasswordField("Password", validators=[DataRequired(),Length(min=6,max=15)])
password_confirm = PasswordField("Confirm Password", validators=[DataRequired(),Length(min=6,max=15), EqualTo('password')])
first_name = StringField("First Name", validators=[DataRequired(),Length(min=2,max=55)])
last_name = StringField("Last Name", validators=[DataRequired(),Length(min=2,max=55)])
submit = SubmitField("Register Now")
def validate_email(self,email):
user = User.query.filter_by(email=**email.data**).first()
if user:
raise ValidationError("Email is already in use. Pick another one.")