Что произойдет, когда я добавлю приложение Django в INSTALLED_APPS? - PullRequest
3 голосов
/ 17 января 2010

Вот ситуация. У меня есть проект Django с двумя установленными приложениями. Оба приложения работают нормально, если они установлены независимо друг от друга.

Однако, если я перечислю оба приложения в settings.INSTALLED_APPS, функция reverse (), похоже, не работает для URL в первом приложении. Так что это заставляет меня поверить, что ошибка во втором приложении вызывает проблему.

Если я просто удалю app_2 из настроек. INSTALLED_APPS, URL-адрес app_1 reverse () снова начнет работать. Таким образом, возникает вопрос, что происходит с «Волшебством», когда я добавляю app_2 в настройки. INSTALLED_APPS? Где мне искать в app_2 код, вызывающий эту проблему?

UPDATE:

Я немного сузил проблему, но она становится более странной. В app_2 есть файл admin.py, который определяет несколько пользовательских представлений администратора. В этом файле есть строка, которая вызывает reverse:
reverse('init_script_view', args=['id_content'])

Пока эта строка находится в файле admin.py, все вызовы reverse () не выполняются с исключением NoReverseMatch. Если я уберу эту строку, все будет работать нормально.

Ответы [ 2 ]

4 голосов
/ 17 января 2010

Ничего особенного не происходит, когда вы добавляете приложение в INSTALLED_APPS, но главное, что влияет на вас, это то, что его представления проверяются при вызове reverse().

Способ обратного действия - импортировать все представлений в проекте и посмотреть, какие из них соответствуют указанному вами URL-имени. Однако он довольно хрупкий, и если какое-либо из представлений вызывает ошибку по какой-либо причине или не может быть импортировано, вызов reverse завершится неудачей.

Тот факт, что он дает сбой только после включения приложения app2, указывает, что где-то существует проблема с представлениями в app2. Попробуйте импортировать их по отдельности из оболочки и посмотрите, какие ошибки вы получите.

Отредактировано после обновления Спасибо за дополнительную информацию. Я видел это раньше в своем собственном коде. Вероятно, это связано с тем, что файлы администратора импортируются до обработки urlconf, поэтому обратное действие выдает ошибку. Попробуйте переместить строку admin.autodiscover() вниз до самого конца urls.py, чтобы она стала последней строкой в ​​этом файле.

0 голосов
/ 17 января 2010

Не видя код, сложно сказать наверняка, но я бы предположил, что urls.py app_1 и app_2 содержат одно и то же имя для разных 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), оно должно начать работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...