【问题标题】:Python Flask SQLAlchemy - loading a model into the viewPython Flask SQLAlchemy - 将模型加载到视图中
【发布时间】:2013-05-26 19:02:04
【问题描述】:

我正在关注 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, 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: unbound method load_company_by_id() 必须以 Company 实例作为第一个参数调用(取而代之的是 unicode 实例)。我不清楚为什么我定义的方法会期望比我设计的方法期望更多的参数。

【问题讨论】:

标签: python flask flask-sqlalchemy flask-wtforms


【解决方案1】:

您的方法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)

【讨论】:

  • 这正是我所需要的——谢谢!我删除了多余的方法,只使用了 Company.query.get。
猜你喜欢
  • 1970-01-01
  • 2019-11-05
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
相关资源
最近更新 更多