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_nameStringField 而您需要 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.")