Python 无法在Flask admin上创建模型
我正在Flask上创建一个简单的博客,并尝试实现Flask Admin来管理我的帖子。如果我进入管理区,我可以看到数据库中所有帖子的列表,但当我尝试创建新帖子时,我遇到了下一个错误:Python 无法在Flask admin上创建模型,python,flask,flask-sqlalchemy,flask-extensions,Python,Flask,Flask Sqlalchemy,Flask Extensions,我正在Flask上创建一个简单的博客,并尝试实现Flask Admin来管理我的帖子。如果我进入管理区,我可以看到数据库中所有帖子的列表,但当我尝试创建新帖子时,我遇到了下一个错误: Failed to create model. __init__() takes exactly 4 arguments (1 given) 这是我的帖子模型: class Post(db.Model): __tablename__ = 'news' nid = db.Column(db.Inte
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,它就可以工作。如何修复此问题?因此,我在应用程序中实现了一个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
如果您要坚持使用datetime.datetime.now()
的created\u值datetime.now()
实例化您的模型,您可能需要参考上面的代码,其中等效的datetime.utcnow()
函数被设置为创建日期
和更新日期
的默认值
有一件事我很好奇,那就是你使用了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
查看Flask Admin源代码中的相关部分
创建模型时不传递任何参数:
model = self.model()
def __init__(self, title = "", content = ""):
self.title = title.title()
self.content = content
self.created_at = datetime.datetime.now()
所以你应该支持一个不带参数的构造函数。例如,使用默认参数声明\uuuuu init\uuuu
构造函数:
model = self.model()
def __init__(self, title = "", content = ""):
self.title = title.title()
self.content = content
self.created_at = datetime.datetime.now()
您需要在modelsinit方法中传递默认参数,它将按如下方式创建模型:
class Brand(Base):
__tablename__ = 'Brand'
id = Column(Integer, primary_key = True)
name = Column(String, default = '')
def __init__(self, name = ''): ### default argument passed
self.name = name
这对我来说也是个问题。传递默认值是有效的,但如果您想要一个不想在flask_admin中更改的自定义值,则传递默认值是无效的。例如,在我的模型中,我在init上创建了一个slug字段。如果我在init中将其设置为slug=”“,我必须手动为每个“post”生成slug
从CLI工作、从flask_admin slug生成的帖子是空的,除非我手动设置它
请参阅下面的代码(slugify只是一个去掉字符、空格等并生成url友好的slug的函数)
我正在使用title()保存title case上的值。事实上,我不应该转换内容,我想这是由于太多的编码时间造成的错误。问题是我在每个模型上都有相同的问题,例如,在注册表上,我无法获取密码并存储它的哈希版本;你试过我提供的代码吗?看看这对你是否有效。我很好奇,“我用title()保存title case的值”是什么意思?你存钱干什么?你要把它保存到哪里?是的,你的代码可以工作,谢谢。我将文章标题存储在标题框中(这是标题框中的文章标题)。我仍然需要知道如何将表单值传递给模型的init方法。Flask-Admin无法创建具有非默认参数的构造函数的模型-它不知道如何处理它。在这种情况下,可以随意重写create_model方法()并实现您自己的模型创建逻辑。这是一个原因-Flask管理员无法猜测模型构造函数参数是什么以及它们应该作为输入接收什么。链接已断开