No se pueden crear modelos en Flask-admin

Estoy creando un blog simple en Flask y estoy tratando de implementar Flask-Admin para administrar mis publicaciones. Si voy al área de administración, puedo ver una lista de todas mis publicaciones desde la base de datos, pero cuando bash crear una nueva, aparece el siguiente error:

Failed to create model. __init__() takes exactly 4 arguments (1 given) 

Este es mi modelo posterior:

 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() 

Y este es mi código para agregar el modelo a la interfaz de usuario:

 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)) 

HAGO que puedo editar modelos a través del panel de administración pero no crear otros nuevos. Sé que me estoy perdiendo algo realmente estúpido, pero no puedo entender qué es.

Edición: funciona si no implemento init en el modelo. ¿Cómo puedo arreglar esto?

Eche un vistazo a la parte relevante en el código fuente de Flask-Admin aquí .

El modelo se crea sin pasar ningún argumento:

  model = self.model() 

Así que debes apoyar a un constructor que no tome argumentos también. Por ejemplo, declare su constructor __init__ con argumentos predeterminados:

  def __init__(self, title = "", content = ""): self.title = title.title() self.content = content self.created_at = datetime.datetime.now() 

Entonces, así es como he implementado una clase Post en mi aplicación:

 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 

Si va a continuar con la created_at instancias de su modelo con un valor created_at de datetime.datetime.now() , es posible que desee hacer referencia a mi código anterior, donde la función datetime.utcnow() equivalente se establece como predeterminada para create_date y update_date .

Una cosa de la que tengo curiosidad es su uso de self.title=title.title() y self.content = content.title() ; ¿Están esos valores viniendo de una función?

Si no, y los estás pasando como cadenas, creo que querrías actualizarlos a self.title = title y self.content = content

Eso podría explicar por qué estás viendo tu problema. Si content.title() no es una función, eso resultaría en ningún argumento para ese parámetro …

puede intentar usar lo siguiente y ver si resuelve su problema:

 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 

Debe pasar el argumento predeterminado en el método de inicio de modelos y creará modelos como debería:

 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 

Este es un problema para mí también. Pasar los valores predeterminados funciona, pero no si desea un valor personalizado que no desee cambiar en flask_admin. Un ejemplo es, en mi modelo hago un campo de slug en init. Si lo configuro como slug = “” en el init, tengo que hacer manualmente el slug para cada “post”.

Las publicaciones realizadas desde el trabajo de CLI, desde flask_admin slug están en blanco a menos que las establezca manualmente

Vea el código a continuación (slugify es solo una función que elimina caracteres, espacios, etc. y hace que las babosas sean fáciles de utilizar con url).

 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