【问题标题】:Flask-WTForms and SQLAalchemy SelectField with RelationFlask-WTForms 和 SQLAalchemy SelectField 与关系
【发布时间】:2016-07-10 20:33:56
【问题描述】:

我正在尝试从表单中获取数据并使用 SQLAlchemy 将其发布到数据库我与类别和品牌模型有关系,如产品模型中所示。但我收到一个错误:
AttributeError:“int”对象没有属性“_sa_instance_state” 我不确定,但我认为返回的是 Category() 对象,我必须将 id 传递给实例化的 Product() 对象 这里有什么问题?

型号

class Product(db.Model):
  # Table name
  __tablename__ = 'products'
  # Main Fields
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(255), nullable=False)
  slug = db.Column(db.String(255), nullable=False, unique=True)
  description = db.Column(db.Text(255), nullable=True)
  active = db.Column(db.Boolean)
  # Timestamps
  created = db.Column(db.DateTime(), default=datetime.utcnow)
  updated = db.Column(db.DateTime(), default=datetime.utcnow,
                      onupdate=datetime.now)
  # ForeignKeys
  category_id = db.Column(db.Integer, db.ForeignKey('categories.id'))
  brand_id = db.Column(db.Integer, db.ForeignKey('brands.id'))
  # Backref Relations
  category = db.relationship('Category', backref='products')
  brand = db.relationship('Brand', backref='products')

  def __repr__(self):
      return self.name

  def __unicode__(self):
      return self.name

表格

class ProductForm(Form):
  name = StringField('Name', validators=[Required(), Length(1, 255)])
  slug = StringField('Slug', validators=[Required(), Length(1, 255)])
  description = StringField('Description', validators=[Required(), Length(1, 255)])
  active = BooleanField('Active')
  category = SelectField('Category', coerce=int)
  brand = SelectField('Brand', coerce=int)
  submit = SubmitField('Add Product')

查看

@inventory.route('/product/new/', methods=['GET', 'POST'])
def add_product():
  form = ProductForm()
  categories = [(c.id, c.name) for c in Category.query.all()]
  brands = [(b.id, b.name) for b in Brand.query.all()]
  form.category.choices = categories
  form.brand.choices = brands
  if form.validate_on_submit():
    new_product = Product(name=form.name.data,
                          slug=form.slug.data,
                          description=form.description.data,
                          active=form.active.data,
                          category=form.category.data,
                          brand=form.brand.data)
    db.session.add(new_product)
    db.session.commit()
    flash('New Product has been added')
    return redirect(url_for('inventory.list_products'))
return render_template('inventory/form.html', form=form)

【问题讨论】:

    标签: flask sqlalchemy flask-sqlalchemy flask-wtforms


    【解决方案1】:

    form.category.dataform.brand.data 是 ID。您需要将它们传递为 category_idbrand_id 而不是 categorybrand

    new_product = Product(name=form.name.data,
                              slug=form.slug.data,
                              description=form.description.data,
                              active=form.active.data,
                              category_id=form.category.data,
                              brand_id=form.brand.data)
    

    【讨论】:

    • 非常感谢您的完美回答我试图通过 category=form.category.data.id 以错误的方式做到这一点......非常感谢
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2019-10-12
    • 2020-06-22
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多