我正在关注Miguel Grinberg的Flask Mega Tutorial。他在关注用户登录/退出以及处理添加内容(博客文章)方面表现出色,但从教程中推断出简单的CRUD操作具有挑战性。重点似乎是添加数据(用户登录,新博客文章),而不是编辑现有数据。
我目前在models.py中有一个公司模型,我认为该方法根据提供的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, request
from app import app
from forms import CompanyForm
from 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实例作为第一个参数调用unbound方法load_company_by_id()(改为使用unicode实例)。我不清楚为什么我定义的方法会比我设计的期望更多的参数。
答案 0 :(得分:3)
您的方法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)