3

我们总是在 settings_test 之外运行我们的测试,就像这样:./manage.py test someapp --settings=settings_test。问题是记住添加选项有时会出现问题。

我想介绍一个只有管理命令test.py的通用应用程序。根据它在 INSTALLED_APPS 设置中的位置,它将覆盖默认值。在命令本身内部,我想更改 --settings 选项的默认值。我怎样才能做到这一点?

我知道我可以创建一个类似于 manage.py 但使用 settings_test 而不是设置的 local.py 文件。但是,关键是仍然运行 ./manage.py,但将 settings_test 作为默认值,而不是在 ./manage.py test someapp 之后不断输入“--settings=settings_test”

4

3 回答 3

3

经过几次尝试,我发现在调用实际管理命令之前,manage.py 设置设置的时间足够长,因此基本上不可能(据我所知)在那里更改它们。最终我决定,因为改变 manage.py 似乎是可以的 - 例如,那里有你的默认设置文件 - 这将是一个处理这个问题的合理地方,所以我在那里实现了它:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")

    argv = sys.argv
    try:
        if argv[1] == 'test' and not any([k.startswith('--settings') for k in argv]):
            os.environ["DJANGO_SETTINGS_MODULE"] = "myapp.test_settings"
    except IndexError:
        pass

    from django.core.management import execute_from_command_line
    execute_from_command_line(argv)

这似乎按预期工作,我没有看到任何重大缺点或问题 - 很高兴得到纠正。

于 2015-05-22T09:44:46.670 回答
2

您可以通过在您的应用程序中实现它们来覆盖默认命令(例如:common_app)。

management.commands在 common_app 中创建一个包。并在那里实现一个测试命令:

# this is commonapp/management/commands/test.py
try:
    from south.management.commands import test
except ImportError:
    from django.core.management.commands import test


class Command(test.Command):
    def handle(self, *args, **kwargs):
        kwargs['settings'] = kwargs.get('settings', 'common_app.settings')
        super(Command, self).handle(*args, **kwargs)

settings.py如果给定没有'--settings ='标志,这将使用common_app中的文件。但是您可以在“settings_test”中更改该字符串,它将加载它可以在您的 python 路径中找到的第一个 settings_test.py。

South也覆盖了这个命令,所以为了完整起见,我添加了 south 导入。但是,如果您安装的任何其他应用程序也覆盖了测试命令......你明白了。

不要忘记__init__.py制作“管理”和“命令”的空文件。

RTFM了解有关 Django 自定义管理命令的更多信息。

于 2013-09-03T14:28:12.300 回答
1

您可以按照@Chris Wesseling 在他的回答中描述的那样覆盖 django 命令。

注意:如果有其他应用程序正在扩展该命令,请将您的应用程序移到INSTALLED_APPS列表中这些应用程序的上方,即

  • 要覆盖runserver命令并且您正在使用'django.contrib.staticfiles',请将您的应用程序放在 staticfiles 应用程序之前
  • 覆盖test命令并且您正在使用测试应用程序,即 django_nose,同样,将您的应用程序放在 django_nose 应用程序之前
于 2017-08-16T13:25:01.543 回答