"admin" не является зарегистрированным пространством имен в Django 1.4

Я пытаюсь обновить довольно большой проект Django до недавно выпущенного Django 1.4, и у меня возникли некоторые проблемы при запуске python manage.py test.

многие внутренние тесты, которые прошли в Django 1.3, теперь терпят неудачу, с действительно странными сообщениями, которые я не могу исправить. Один, который появляется больше всего:

NoReverseMatch: u'admin' is not a registered namespace

это поднято для django.contrib.auth тесты для изменения пароля, в частности (один из которых test_password_change_fails_with_mismatched_passwords (django.contrib.auth.tests.views.ChangePasswordTest). Странная вещь, пространство имен зарегистрирован правильно, и приложение функционирует просто отлично. Я импортирую admin "новым" способом:

url(r'^admin/', include(admin.site.urls)),

когда я Google эту ошибку, в частности, все, что я могу найти, это люди, импортирующие URL-адреса администратора, используя старую схему, и ничего, относящегося к этой проблеме вообще.

Я попытался удалить приложения из INSTALLED_APPS один за другим, но тесты auth просто не пройдут. Кроме того, когда я загружаю интерпретатор Python из python manage.py shell и выполнить reverse('admin:index') URL-адрес разрешает /admin/ без ошибок. Я много читал код и не вижу, где это может падать.

как я уже говорил ранее, это не единственная ошибка, которая происходит. Я также получаю AttributeError: AUTH_PROFILE_MODULE С . Как могут собственные тесты Django терпеть неудачу?

6 ответов


Короткий Ответ: у вас есть копия файлов шаблонов Django admin, скопированных в каталоге шаблонов вашего приложения из более ранней версии Django, затем вы обновили Django, но не обновили (переписали) эти локальные шаблоны.

Ответ: основной причиной этой проблемы является использование более старой версии файлов шаблонов Django admin (которые устанавливаются там, где установлен сам django, обычно python site-packages или


как оказалось, это было связано с приказом TEMPLATE_LOADERS ключ в моем файле настроек.

у меня было следующее:

TEMPLATE_LOADERS = (
    'django.template.loaders.app_directories.Loader',
    'django.template.loaders.filesystem.Loader',
)

что, так или иначе, вызвало ошибку при реверсировании URL-адресов администратора. Переключение двух раундов решило проблему. Я хотел бы знать, как это происходит, поскольку он не воспроизводится в пустом проекте Django 1.4.

что был воспроизводимым, однако, был AttributeError на settings.AUTH_PROFILE_MODULE. Оказывается, это ошибка в Django 1.4, который был подан в день освобождения здесь.


попробуйте добавить namespace= "admin" В метод include в urls.py файл.

пример: url-адрес(р'^админ/', включить("someUrlpattern", пространство имен="админ"))


загрузчик шаблонов app_directories загружает шаблоны из каталога шаблонов INSTALLED_APPS, а загрузчик файловой системы загружает их из каталога шаблонов, настроенного в настройках TEMPLATE_DIRS.

переключение двух из них имеет огромное значение, потому что если у вас есть пользовательские шаблоны в вашем приложении, он не будет загружаться, если app_directories находится наверху. Если загрузчик файловой системы находится вверху, django сначала будет искать шаблон в каталоге шаблонов перед загрузкой по умолчанию из installed_apps.

вот почему он не воспроизводится в пустом проекте Django. Он будет искать шаблоны в нужных местах.


мой solutuion должен был обновить django до новейшего cersion: pip install --обновление django==1.6.1 перед этим проверьте установленную версию: pip freeze | grep Django - Я обнаружил, что на сервере релиза была старая версия, обновление решило эту проблему!


у меня было подобное сообщение об ошибке, потому что мой URLs conf имел 2 logout URLs определены .

urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='home.html'), name='home'),
    url(r'^api/v1/', include(router.urls)),
    url(r'^logout/$', auth_views.logout, name='logout'),
    url(r'^login/$', auth_views.login, {'template_name': 'login.html'}, name='login'),
    url(r'^logout/$', auth_views.logout, {'template_name': 'logged_out.html'}, name='logout'),
]