当我将一个Django应用程序添加到INSTALLED_APPS时会发生什么?

时间:2010-01-17 03:56:02

标签: python django

情况如下。我有一个带有两个安装的应用程序的django项目。如果这两个应用程序彼此独立安装,它们似乎可以正常运行。

但是,如果我在settings.INSTALLED_APPS中列出两个应用程序,则第一个应用程序中的反向()函数似乎会中断。因此,这让我相信第二个应用程序中的错误导致了问题。

如果我只是从settings.INSTALLED_APPS中删除app_2,则app_1的url reverse()会再次开始工作。因此,当我将app_2添加到settings.INSTALLED_APPS时,问题就变成了什么“魔术”?我应该在app_2中查找导致此问题的代码?

更新

我已经将问题缩小了一点,但它变得更加陌生。 app_2有一个admin.py文件,用于定义一些自定义管理视图。在该文件中是一个调用reverse的行:
reverse('init_script_view', args=['id_content'])

只要该行在admin.py文件中,所有对reverse()的调用都会因NoReverseMatch异常而失败。如果我删除该行,一切似乎都正常。

2 个答案:

答案 0 :(得分:4)

将应用程序添加到INSTALLED_APPS时没有任何特殊情况,但影响您的主要因素是在您调用reverse()时会检查其视图。

反向工作的方式是在项目中导入所有视图,并查看哪些匹配您给出的URL名称。但是,它非常脆弱,如果任何视图由于某种原因导致错误,或者无法导入,reverse调用将失败。

只有在包含app2后它才会失败,这表明app2中的视图存在问题。尝试从shell中单独导入它们,看看你得到了什么错误。

更新后修改感谢您提供额外的细节。我以前在自己的代码中看过这个。这可能是因为在处理urlconf之前导入了管理文件,因此反向出错。尝试将admin.autodiscover()行向下移动到urls.py的最底部,以便它是该文件中的最后一行。

答案 1 :(得分:0)

在没有看到代码的情况下,很难肯定地说,但我猜想app_1和app_2的urls.py包含不同网址的相同名称,例如:

app_1/urls.py:
  ...
  url(r'^app_1/foo/$', 'app_1.views.foo', name='foo')
  ...

app_2/urls.py:
  ...
  url(r'^app_2/foo/$', 'app_2.views.foo', name='foo')
  ...

如果你清理那些名字(我见过的最常见的约定是appname_viewname),它应该开始工作。