2016-02-02 4 views
0

Я работаю над модификацией приложения cookiecutter Flask.TypeError при добавлении задачи скрипта фляги

В административном модуле manage.py на основе флеш-скрипта я пытаюсь создать новую задачу «create_admin», которая добавляет пользователя администратора.

@manager.command 
def create_admin(): 
    """Creates the admin user.""" 
    db.session.add(User(
     email="[email protected]", 
     password="admin", 
     admin=True, 
     confirmed=True, 
     confirmed_on=datetime.datetime.now() 
    ) 
    ) 
    db.session.commit() 

Я добавил его в конце списка, как вы можете увидеть:

manager.add_command('server', Server()) 
manager.add_command('shell', Shell(make_context=_make_context)) 
manager.add_command('db', MigrateCommand) 
manager.add_command("urls", ShowUrls()) 
manager.add_command("clean", Clean()) 
manager.add_command("create_admin", create_admin()) 

У меня есть модель «пользователь», который выглядит так:

class User(UserMixin, SurrogatePK, Model): 

    __tablename__ = 'users' 
    username = Column(db.String(80), unique=True, nullable=True) 
    email = Column(db.String(80), unique=True, nullable=False) 
    #: The hashed password 
    password = Column(db.String(128), nullable=True) 
    created_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) 
    first_name = Column(db.String(30), nullable=True) 
    last_name = Column(db.String(30), nullable=True) 
    active = Column(db.Boolean(), default=False) 
    is_admin = Column(db.Boolean(), default=False) 
    confirmed = db.Column(db.Boolean, default=False) 
    confirmed_on = db.Column(db.DateTime, nullable=True) 


    def __init__(self, username, email, password=None, **kwargs): 
     db.Model.__init__(self, username, email=email, **kwargs) 
     if password: 
      self.set_password(password) 
     else: 
      self.password = None 

Когда я попробуйте запустить новую функцию:

$ python manage.py create_admin       
Traceback (most recent call last): 
    File "manage.py", line 57, in <module> 
    manager.add_command("create_admin", create_admin()) 
    File "manage.py", line 46, in create_admin 
    confirmed_on=datetime.datetime.now() 
TypeError: __init__() takes at least 3 arguments (3 given) 
(flask_mini) 

какой я doi Неправильно?

редактировать:

File "C:\envs\r2\myflaskapp\myflaskapp\models\user.py", line 31, in __init__ 
    db.Model.__init__(self, username=username, email=email, **kwargs) 
    File "c:\envs\virtalenvs\flask_mini\lib\site-packages\sqlalchemy\ext\declarative\base.py", line 525, in _declarative_constructor 
    (k, cls_.__name__)) 
TypeError: 'admin' is an invalid keyword argument for User 

ответ

1

Ваш User() класс принимает username позиционную аргумент:

def __init__(self, username, email, password=None, **kwargs): 

но не разъехаться в:

db.session.add(User(
    email="[email protected]", 
    password="admin", 
    admin=True, 
    confirmed=True, 
    confirmed_on=datetime.datetime.now() 
) 
) 

Пасс один в качестве первый аргумент:

db.session.add(User(
    'admin', 
    email="[email protected]", 
    password="admin", 
    is_admin=True, 
    confirmed=True, 
    confirmed_on=datetime.datetime.now() 
) 
) 

Я исправил admin до is_admin; у вас есть только поле is_admin.

Обратите внимание, что вы можете только передать FieldValues ​​на SQLAlchemy в BaseClass в качестве ключевого слова аргументы:

db.Model.__init__(self, username=username, email=email, **kwargs) 
+0

Спасибо, когда я запускаю это я получаю: db.Model .__ INIT __ (я, имя пользователя, адрес электронной почты = адрес электронной почты * * kwargs) ТипError: _declarative_constructor() принимает ровно 1 аргумент (6 данных) – user61629

+0

@ user61629: Я подозреваю, что модель SQLAlchemy не принимает позиционные аргументы. Передайте аргументы как ключевые слова аргументы * only *: 'db.Model .__ init __ (self, username = username, email = email, ** kwargs)' –

+0

Еще раз спасибо за просмотр, пожалуйста, см. Выше. – user61629

 Смежные вопросы

  • Нет связанных вопросов^_^