找不到django自定义命令

时间:2010-02-03 08:19:49

标签: django

让django自定义命令起作用时遇到问题。

来自django documetation,已经放置了

application/
    manage.py
    blog/
        __init__.py
        models.py
        management/
            __init__.py
            commands/
                __init__.py
                myapp_task.py
        views.py

myapp_task.py内容

from django.core.management.base import NoArgsCommand

class Command(NoArgsCommand):
    def handle_noargs(self, **options):
        print 'Doing task...'
        # invoke the functions you need to run on your project here
        print 'Done'

跑步时

python manage.py myapp_task

收到错误

Unknown command: 'myapp_task'

8 个答案:

答案 0 :(得分:49)

你的答案中的目录结构有点含糊不清;当放置文件时,如下django应该能够找到你的命令:

project/ # in your question this would be 'application'
    manage.py
    blog/
        __init__.py
        models.py
        management/
            __init__.py
            commands/
                __init__.py
                myapp_task.py
        views.py

此外,您需要在settings.py

中启用您的应用
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.admin',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'blog', # <= your app here ...
)

答案 1 :(得分:3)

我遇到了同样的问题。原因是项目根目录不在我的$ PYTHONPATH中。在这种情况下的解决方案是键入(在Linux机器上)像

这样的东西
PYTHONPATH=./project python manage.py myapp_task

答案 2 :(得分:0)

我认为命令/需要在管理/目录中。

答案 3 :(得分:0)

如果项目是字节编译的,django.core.management.find_commands()将只查找.py文件。如果您的自定义命令位于.pyc文件中,则需要使用https://code.djangoproject.com/ticket/19085处的补丁修补django / core / management / commands / __ init__.py

答案 4 :(得分:0)

您好我也有这个问题,发现我正在将参数标识符与文件名

混合在一起

所以该文件是您想要的命令的名称,即updater我将 updatefiles.py 更改为 updater.py

class Command(BaseCommand):
    help = 'Update Files Since \'X\' Days Ago'   

    def add_arguments(self, parser):
        parser.add_argument('updatefiles', nargs='+', type=int)

    def handle(self, *args, **options):

        days_ago = int(options['updatefiles'][0])
        days_ago = (days_ago * -1) if days_ago < 0 else days_ago

        self.stdout.write('Adding files since %s days ago' % days_ago)
        add_files_function(days_ago)

然后运行我会用

python manage.py updater

答案 5 :(得分:0)

我有同样的问题。我从和示例中剪切并粘贴了文件名,并在文件名的开头粘贴了一个空格。因此Django无法找到它。

答案 6 :(得分:0)

我的问题是在我的主应用程序中添加管理目录,也就是在我的 settings.py 旁边 一旦我将它添加到另一个应用程序,它就可以工作了

答案 7 :(得分:-2)

这是因为 init .pyc不会在“management”和“commands”文件夹中自动创建。复制your_app/__init__.pyyour_app/__init__.pyc并将其粘贴到management /和commands /文件夹中。