‘admin’ no es un espacio de nombres registrado en Django 1.4

Estoy intentando actualizar un proyecto Django bastante grande al Django 1.4 recientemente lanzado, y tengo algunos problemas al ejecutar la python manage.py test .

Muchas de las pruebas internas que se aprobaron en Django 1.3 ahora están fallando, con mensajes realmente extraños que parece que no puedo solucionar. Una de las que más aparece es:

 NoReverseMatch: u'admin' is not a registered namespace 

Esto se django.contrib.auth para las pruebas de django.contrib.auth para cambiar la contraseña en particular (una de las cuales es test_password_change_fails_with_mismatched_passwords (django.contrib.auth.tests.views.ChangePasswordTest) . Lo extraño es que el espacio de nombres está registrado correctamente y la aplicación funciona Estoy bien. Estoy importando admin de la forma “nueva”:

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

En particular, cuando busco este error en Google, todo lo que puedo encontrar es gente que importe las URL de administrador usando el esquema anterior, y nada relacionado con este problema.

He intentado eliminar aplicaciones de INSTALLED_APPS una por una, pero las pruebas de autenticación simplemente no pasan. Además, cuando cargo un intérprete de python manage.py shell y ejecuto la python manage.py shell reverse('admin:index') la URL se resuelve en /admin/ sin errores. He leído el código extensivamente y no puedo ver dónde se puede estar cayendo.

    Como mencioné anteriormente, este no es el único error que está ocurriendo. También AttributeError: AUTH_PROFILE_MODULE de la test_site_profile_not_available (django.contrib.auth.tests.models.ProfileTestCase) , aunque AUTH_PROFILE_MODULE se define en mi archivo settings.py . ¿Cómo pueden fallar las propias pruebas de Django de esta manera?

    Respuesta corta: tiene una copia de los archivos de plantilla de administrador de Django copiados en el directorio de plantillas de su aplicación de una versión anterior de Django, luego actualizó Django pero no actualizó (re-copió) esas plantillas locales.

    Respuesta larga: la causa principal de este problema es el uso de una versión anterior de los archivos de plantilla de administrador de Django (que se instalan donde está instalado el propio django, generalmente el directorio de dist-packages de site-packages o dist-packages python). Hay un cambio incompatible con versiones anteriores en Django 1.5 sobre la etiqueta de la plantilla url, en la que el primer parámetro debe ser una cadena, de las notas de la versión de Django 1.5 :

    Una característica obsoleta que vale la pena mencionar es el cambio a la etiqueta url de “nuevo estilo”. Antes de Django 1.3, la syntax como {% url myview%} se interpretaba incorrectamente (Django consideraba que “myview” era un nombre literal de una vista, no una variable de plantilla llamada myview). Django 1.3 y versiones posteriores introdujeron la {% load url from future%} syntax para introducir el comportamiento corregido donde myview se veía como una variable.

    Entonces, el problema es que tienes una copia de los archivos de plantilla del administrador en una de las carpetas de plantillas de tu aplicación, que se copian de una versión anterior de Django. Esto generalmente se hace para anular las plantillas de administración predeterminadas. Debido al cambio de incompatibilidad anterior observado, este archivo de plantilla obsoleta no puede cargarse en un entorno Django más nuevo, y causa un error extraño: NoReverseMatch: u'admin' is not a registered namespace .

    El cambio de orden de las entradas de TEMPLATE_LOADERS ignorará las modificaciones de las plantillas de administración local en favor del archivo de plantillas predeterminadas (porque las plantillas de Django predeterminadas se cargan por una ruta completa con el filesystem.Loader ). Si las modificaciones son necesarias (lo que suele ser el caso), debe actualizar los archivos de la plantilla de administración local a partir de las nuevas plantillas de instalación de Django y volver a aplicar sus modificaciones.

    Nota 1: una situación similar es cuando las plantillas de administración local son más nuevas que las predeterminadas de la instalación de Django, lo que parece ser su caso. Del mismo modo, la mejor solución es actualizar todas las copias de las plantillas de administración.

    Nota 2: Otra posibilidad de obtener dicho error es al usar virtualenv. Por ejemplo, si está ejecutando su proyecto con un virtualenv pero la entrada TEMPLATE_DIRS para las plantillas de administración de Django es para su instalación global de python, puede obtener este error.

    Como resultado, esto se debió al orden de la clave TEMPLATE_LOADERS en mi archivo de configuración.

    Tuve los siguientes:

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

    que, de alguna manera, causó el error al revertir las URL de administración. El cambio de las dos rondas resolvió el problema. Me encantaría saber cómo sucede esto, ya que no es reproducible en un proyecto Django 1.4 en blanco.

    Lo que fue reproducible, sin embargo, fue el AttributeError de AttributeError para la settings.AUTH_PROFILE_MODULE . settings.AUTH_PROFILE_MODULE . Resulta que este es un error en Django 1.4, que se archivó el día del lanzamiento aquí .

    Intente agregar namespace = “admin” dentro del método de inclusión en el archivo urls.py.

    ej: url (r ‘^ admin /’, include (“someUrlpattern”, namespace = “admin”))

    El cargador de plantillas app_directories carga las plantillas desde el directorio de plantillas INSTALLED_APPS, mientras que el cargador del sistema de archivos las carga desde el directorio de plantillas configurado en su configuración de TEMPLATE_DIRS.

    Cambiar los dos hace una gran diferencia porque si tiene plantillas personalizadas en su aplicación, no se cargará si el directorio de aplicaciones está en la parte superior. Si el cargador del sistema de archivos está en la parte superior, django buscará una plantilla en el directorio de su plantilla antes de cargar la predeterminada de las_paps instaladas.

    Es por eso que no es reproducible en un proyecto de Django en blanco. Buscará plantillas en los lugares correctos.

    Mi solución fue actualizar django a la versión más nueva de cersion: pip install –upgrade django == 1.6.1 antes de esto, verifique su versión instalada: pip freeze | grep Django – ¡Encontré que en el servidor de lanzamiento había una versión anterior, la actualización solucionó este problema!

    Me sucedió un mensaje de error similar porque mi URL conf tenía 2 URL de logout de logout definidas.

     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'), ]