python django django-1.4

python - ''admin'' no es un espacio de nombres registrado en Django 1.4



django-1.4 (6)

Estoy intentando actualizar un proyecto de 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 plantea 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 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?


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 administrador. 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 here .


El cargador de plantillas de app_directories carga las plantillas desde el directorio de plantillas INSTALLED_APPS, mientras que el cargador de sistemas de archivos las carga desde el directorio de plantillas configurado en su configuración 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 se encuentra en la parte superior, django buscará una plantilla en el directorio de su plantilla antes de cargar la predeterminada de las_apps instaladas.

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


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

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


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


Mi solución fue actualizar django a la nueva versión 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!


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ó (volvió a copiar) 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 administración 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 hacia atrás incompatible 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 sintaxis 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%} sintaxis 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 compatibilidad anterior observado, este archivo de plantilla obsoleta no se puede cargar 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 a 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 las modificaciones en ellas.

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.