我正在Flask上创建一个简单的博客,我正在尝试使用Flask-Admin来管理我的帖子。如果我去管理区域,我可以看到来自数据库的所有帖子的列表,但是当我尝试创建一个新帖子时,我得到了下一个错误:
Failed to create model. __init__() takes exactly 4 arguments (1 given)
这是我的帖子模型:
class Post(db.Model):
__tablename__ = 'news'
nid = db.Column(db.Integer, primary_key = True)
title = db.Column(db.String(100))
content = db.Column(db.Text)
created_at = db.Column(db.DateTime)
def __init__(self, title, content):
self.title = title.title()
self.content = content
self.created_at = datetime.datetime.now()
这是我将模型添加到UI的代码:
from flask import Flask, session
from models import db, Post
from flask.ext.admin import Admin
from flask.ext.admin.contrib.sqlamodel import ModelView
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:pass@localhost/appname'
db.init_app(app)
admin = Admin(app)
admin.add_view(ModelView(Post, db.session))
我可以通过管理面板编辑模型,但不能创建新模型。我知道我错过了一些非常愚蠢的东西,但我无法弄清楚它是什么。
编辑:如果我没有在模型上实现 init ,它会起作用。我该如何解决这个问题?
答案 0 :(得分:20)
查看Flask-Admin here源代码中的相关部分。
创建模型时不传递任何参数:
model = self.model()
所以你应该支持一个不带参数的构造函数。例如,使用默认参数声明您的__init__
构造函数:
def __init__(self, title = "", content = ""):
self.title = title.title()
self.content = content
self.created_at = datetime.datetime.now()
答案 1 :(得分:3)
所以,这就是我在我的应用程序中实现Post类的方法:
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.Unicode(80))
body = db.Column(db.UnicodeText)
create_date = db.Column(db.DateTime, default=datetime.utcnow())
update_date = db.Column(db.DateTime, default=datetime.utcnow())
status = db.Column(db.Integer, default=DRAFT)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
def __init__(self, title, body, createdate, updatedate, status, user_id):
self.title = title
self.body = body
self.create_date = create_date
self.update_date = update_date
self.status = status
self.user_id = user_id
如果您坚持使用created_at
值datetime.datetime.now()
来实例化您的模型,您可能需要参考上面的代码,其中等效的datetime.utcnow()
函数设置为create_date
和update_date
的默认值。
我很好奇的一件事是您使用self.title=title.title()
和self.content = content.title()
;那些来自函数的值是什么?
如果没有,并且您将它们作为字符串传递,我认为您希望将这些更新为self.title = title
和self.content = content
这可以解释为什么你会看到你的问题。如果content.title()
不是函数,那将导致该参数没有参数......
您可以尝试使用以下内容,看看它是否可以解决您的问题:
class Post(db.Model):
__tablename__ = 'news'
nid = db.Column(db.Integer, primary_key = True)
title = db.Column(db.String(100))
content = db.Column(db.Text)
created_at = db.Column(db.DateTime, default=datetime.datetime.now())
def __init__(self, title, content, created_at):
self.title = title
self.content = content
self.created_at = created_at
答案 2 :(得分:0)
对我来说这也是一个问题。传递默认值有效,但如果您想要在flask_admin中不想更改自定义值,则不会。一个例子是,在我的模型中,我在init上创建了一个slug字段。如果我在init中将它设置为slug =“”,我必须为每个“post”手动制作slug。
从CLI工作的帖子,来自flask_admin slug的帖子是空白的,除非我手动设置。
请参阅下面的代码(slugify只是一个删除字符,空格等的函数,并使网址友好的slugs)。
class Article(Base):
__tablename__ = "articles"
id = Column(Integer, primary_key=True)
posted_time = Column(DateTime(timezone=True))
updated_time = Column(DateTime(timezone=True))
image = Column(String(200))
article_title = Column(String(200))
article_body = Column(String)
slug = Column(String(100), unique=True)
tags = relationship("ArticleTag", secondary=tags, backref="articles")
categories = relationship("ArticleCategory", secondary=categories, backref="articles")
def __init__(self, article_title="", posted_time=None, updated_time=None, image="", article_body="", slug=""):
self.slug = slugify(article_title)
self.article_title = article_title
self.posted_time = posted_time
self.updated_time = updated_time
self.image = image
self.article_body = article_body