'admin' не является зарегистрированным пространством имен в Django 1.4 - PullRequest
17 голосов
/ 26 марта 2012

Я пытаюсь обновить довольно большой проект 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)),

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

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

Как я упоминал ранее, это не единственная ошибка, которая возникает. Я также получаю AttributeError: AUTH_PROFILE_MODULE из теста test_site_profile_not_available (django.contrib.auth.tests.models.ProfileTestCase), хотя в моем файле settings.py определено AUTH_PROFILE_MODULE. Как собственные тесты Джанго могут проваливаться, как это?

Ответы [ 6 ]

14 голосов
/ 20 мая 2013

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

Длинный ответ: Основная причина этой проблемы - использование более старой версии файлов шаблонов администратора Django (которые устанавливаются там, где установлен сам django, обычно это site-packages Python).или dist-packages каталог).В Django 1.5 есть обратное несовместимое изменение тега шаблона URL, в котором первый параметр должен быть строкой из Замечаний к выпуску Django 1.5 :

Одна устаревшая особенность, на которую стоит обратить вниманиеэто переход к тегу URL «нового стиля».До Django 1.3 синтаксис, такой как {% url myview%}, интерпретировался неправильно (Django считал «myview» буквальным именем представления, а не переменной шаблона с именем myview).В Django 1.3 и выше введен синтаксис {% load url from future%} для исправления некорректного поведения, при котором myview воспринималось как переменная.

Итак, проблема в том, что у вас есть копия шаблона администраторафайлы в одной из папок шаблонов вашего приложения, которая копируется из более ранней версии Django.Обычно это делается для переопределения стандартных шаблонов администратора.Из-за отмеченного обратного несовместимого изменения эти устаревшие файлы шаблонов не могут загружаться в более новой среде Django и вызывают странную ошибку: NoReverseMatch: u'admin' is not a registered namespace.

Изменение порядка записей TEMPLATE_LOADERS приведет к игнорированию шаблонов локального администратора.изменения в пользу файла шаблонов по умолчанию (потому что шаблоны Django по умолчанию загружаются по полному пути с filesystem.Loader).Если необходимы изменения (что обычно и происходит), вы должны обновить файлы шаблонов локального администратора из ваших новых шаблонов установки Django и повторно применить к ним ваши изменения.

Примечание 1: AАналогичная ситуация возникает, когда шаблоны локального администратора новее, чем установка по умолчанию в Django, что, по-видимому, именно в вашем случае.Аналогичным образом, лучшим решением будет обновить все копии шаблонов администратора.

Примечание 2: Другая возможность получить такую ​​ошибку - при использовании virtualenv.Например, если вы запускаете свой проект с virtualenv, но запись TEMPLATE_DIRS для шаблонов администратора Django относится к вашей глобальной установке на python, вы можете получить эту ошибку.

9 голосов
/ 27 марта 2012

Как оказалось, это было из-за порядка ключа 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, которая была подана в день выпуска здесь .

5 голосов
/ 04 июня 2014

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

ex: url (r '^ admin /', include ("someUrlpattern", namespace = "admin"))

2 голосов
/ 06 июня 2012

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

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

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

0 голосов
/ 20 июля 2017

У меня было похожее сообщение об ошибке, потому что в моих URL-адресах было определено 2 logout URL-адресов.

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'),
]
0 голосов
/ 09 марта 2016

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

...