【问题标题】:Programming error with WTForms StringField writing to PostgresWTForms StringField 写入 Postgres 时出现编程错误
【发布时间】:2018-02-16 03:02:47
【问题描述】:

我的数据库是一个 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 定义为:

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}]

有什么想法我哪里出错了吗?

【问题讨论】:

    标签: postgresql flask wtforms flask-wtforms


    【解决方案1】:

    您的代码不完整 - 您没有显示实际尝试设置模型数据并将其保存到数据库的位置,但错误显示 &lt;wtforms.fields.core.StringField object at 0x110580c18&gt; 是您设置为 name 属性的值,所以你可能会这样做:

    device = Device()
    device.name = form.device_name
    db.session.add(device)
    db.session.commit()
    

    这会导致类似于您看到的错误,因为form.device_nameStringField,而您想要用户提交的数据。要从表单元素中获取数据,您需要使用.data 属性:

    device = Device()
    device.name = form.device_name.data
    db.session.add(device)
    db.session.commit()
    

    【讨论】:

      【解决方案2】:

      使用 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.")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-01
        • 2018-09-27
        • 2015-09-29
        • 2015-09-28
        • 2010-11-23
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多