【问题标题】:What happen when I add a Django app to INSTALLED_APPS?当我将 Django 应用程序添加到 INSTALLED_APPS 时会发生什么?
【发布时间】:2010-01-17 03:56:01
【问题描述】:

情况是这样的。我有一个安装了两个应用程序的 django 项目。如果两个应用程序相互独立安装,它们似乎可以正常运行。

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

如果我只是从 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 异常。如果我删除该行,一切似乎都正常。

【问题讨论】:

  • 你说reverse“休息”是什么意思?它是否返回不正确的值?是否引发异常?如果是这样,引发了什么异常,当它发生时你传递了什么参数?您是否在对reverse 的所有呼叫或仅部分呼叫中遇到问题?如果只有一个子集,您将如何定义该子集?
  • 它返回了一个NoReverseMatch异常,似乎所有的reverse调用都受到了影响。

标签: python django


【解决方案1】:

当您将应用程序添加到 INSTALLED_APPS 时不会发生任何特别的事情,但影响您的主要事情是当您调用 reverse() 时会检查其视图。

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

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

更新后编辑感谢您提供额外的详细信息。我以前在自己的代码中看到过这一点。可能是因为在处理 urlconf 之前正在导入管理文件,所以这个反向给出了错误。尝试将admin.autodiscover() 行向下移动到 urls.py 的最底部,使其成为该文件中的最后一行。

【讨论】:

  • app2 只包含一个视图,它可以毫无问题地导入。有关我发现的新信息,请参阅问题的更新。
  • 是的,是 admin.autodiscover() 导致了问题。谢谢。
【解决方案2】:

没有看到代码,很难确定,但我猜app_1和app_2的urls.py包含不同url的相同名称,例如:

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),它应该会开始工作。

【讨论】:

  • 感谢您的回复,但我已经检查过了。 app_2 不包含任何命名的 URL 模式,也没有冲突的视图名称。
猜你喜欢
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多