为了账号安全,请及时绑定邮箱和手机立即绑定

Python Flask SQLAlchemy-将模型加载到视图中

Python Flask SQLAlchemy-将模型加载到视图中

白猪掌柜的 2021-03-17 17:13:54
我正在关注Miguel Grinberg编写的Flask Mega教程。他在专注于登录/注销用户以及处理添加内容(博客帖子)方面做得非常出色,但是从本教程中推断出简单的CRUD操作是一项挑战。重点似乎是添加数据(用户登录名,新博客帖子),而不是编辑现有数据。我目前在models.py中有一个Company模型,我认为该方法基于提供的ID返回Company对象:class Company(db.Model):  id = db.Column(db.Integer, primary_key = True)  name = db.Column(db.String(120), index = True)  def load_company_by_id(id):    return Company.query.get(int(id))  def __repr__(self):    return '<Company %r>' % (self.name)我认为,我有:from flask import render_template, flash, redirect, requestfrom app import appfrom forms import CompanyFormfrom models import Company......@app.route('/company/edit/<id>', methods=['GET','POST'])def company_edit(id):  company = Company.load_company_by_id(id)  form = CompanyForm(obj=company)  return render_template('company_form.html', form = form)我收到一个错误:TypeError:必须以Company实例作为第一个参数来调用未绑定方法load_company_by_id()(取而代之的是unicode实例)。我不清楚为什么我定义的方法会期望比我设计的期望更多的参数。
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

你的方法load_company_by_id()被定义为目前的实例方法,而你试图使用它作为一个类的方法。要使其成为类方法,您需要使用classmethod装饰器:


@classmethod

def load_company_by_id(cls, id):

    # Class itself is passed as the first argument.

    return cls.query.get(int(id))

但是,为什么不完全删除此方法并直接调用Company.query.get()呢?


# Note the route (<int:id> part), not only it makes sure that id is an integer,

# it also returns an int.

@app.route('/company/edit/<int:id>', methods=['GET','POST'])

def company_edit(id):

    company = Company.query.get(id)

    form = CompanyForm(obj=company)

    return render_template('company_form.html', form=form)


查看完整回答
反对 回复 2021-03-27
  • 1 回答
  • 0 关注
  • 333 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信