2012-03-26 9 views
17

Estoy intentando actualizar un proyecto bastante grande Django Django a la recién estrenada 1.4, y estoy teniendo algunos problemas cuando se ejecuta python manage.py test.'admin' no es un espacio de nombres registrados en Django 1.4

Las porciones de las pruebas internas que pasaron en Django 1.3 están fallando, con mensajes muy extraños que me parece que no puede arreglar. Que aparece más es:

NoReverseMatch: u'admin' is not a registered namespace 

Esto se establezca para django.contrib.auth pruebas de cambio de contraseña en particular (uno de los cuales es test_password_change_fails_with_mismatched_passwords (django.contrib.auth.tests.views.ChangePasswordTest) Lo extraño es, el espacio de nombres se ha registrado correctamente y que las funciones de aplicación muy bien.. estoy importando admin en la forma "nueva":

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

Cuando Google este error en particular, todo lo que puedo encontrar es que la gente que importan las direcciones URL de administración usando el viejo esquema, y ​​nada en relación con este problema en absoluto.

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 desde python manage.py shell y ejecuto reverse('admin:index'), la URL se resuelve en /admin/ sin errores. He leído extensamente el código y no puedo ver dónde puede estar cayendo.

Como ya he mencionado anteriormente, este no es el único error que está ocurriendo. También recibo AttributeError: AUTH_PROFILE_MODULE de la prueba test_site_profile_not_available (django.contrib.auth.tests.models.ProfileTestCase), aunque AUTH_PROFILE_MODULE está definido en mi archivo settings.py. ¿Cómo pueden las propias pruebas de Django fallar así?

+1

Hay algo mal en su código. Las pruebas de Django no fallan en circunstancias normales. Solo necesita inspeccionar cuidadosamente todo. Tuve un error similar, y resultó estar relacionado con un paréntesis desbalanceado en uno de mis patrones url. –

+0

¿Terminaste descubriendo lo que pasó? Honestamente también entré en algo como esto y no estoy seguro de lo que pasó. Terminé teniendo que simplemente no mover las cosas de la plantilla de administrador a mi propio directorio de aplicaciones. – stormlifter

+1

Tengo el mismo error para algunas pruebas django 1.5, como test_middleware_disabled. Intenté revertir el orden de TEMPLATE_LOADERS como se sugiere en la respuesta aceptada, y eliminé mis plantillas de administrador del directorio de plantillas de mi aplicación (como lo sugirió Amir), pero sigo recibiendo el error. –

Respuesta

9

Como resultado, esto fue debido a la orden de la tecla TEMPLATE_LOADERS en mi archivo de configuración.

que tenía la siguiente:

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

la que, de alguna manera, ha provocado el error al dar marcha atrás URL de administración. Cambiar 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 era reproducible, sin embargo, era el AttributeError para settings.AUTH_PROFILE_MODULE. Resulta que esto es un error en Django 1.4, que se presentó el día de lanzamiento here.

+0

¿Hay alguna solución para el error AttributeError? – acjay

+0

No he encontrado uno todavía, pero me gustaría saber si hay alguna manera de hacerlo. Me sentí frustrado por la baja prioridad que se le dio a este problema, ya que evita el uso de TDD o la integración continua para probar el código. Intenté crear un corrector de prueba personalizado que saltaría esta prueba en particular, pero no podría hacerlo funcionar. La única solución que sé (lo que no es ideal) es probar solo tus propias aplicaciones. Si usa 'django-nose', este es el comportamiento predeterminado. –

2

El cargador de plantillas de los app_directories carga 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 la configuración de TEMPLATE_DIRS.

Cambio del dos de ellos hace una gran diferencia, porque si tiene plantillas en su aplicación no se carga si los app_directories es en la parte superior. Si el cargador del sistema de archivos está en la parte superior, django buscará primero una plantilla en su directorio de plantillas antes de cargar la predeterminada de instalado_apps.

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

+3

Esta pregunta se trata de un error relacionado con el URLconf, no con las plantillas. Es por eso que estaba (y todavía estoy) perplejo sobre la solución. –

14

respuesta corta: Usted tiene una copia de Django archivos de plantillas de administración copiados en el del directorio de plantillas de la aplicación de una versión anterior de Django, a continuación, ha realizado una actualización de Django, pero no actualizó (volver a copiar) las plantillas locales .

Respuesta larga: La principal causa de este problema está utilizando una versión anterior de los archivos de plantillas de administración de Django (que se instalan en el propio Django está instalado, por lo general directorio site-packages o dist-packages del pitón). Hay un cambio incompatible atrás en Django 1.5 sobre etiqueta de plantilla URL, en el que el primer parámetro debe ser una cadena, desde Django 1.5 release notes:

One deprecated feature worth noting is the shift to “new-style” url tag. Prior to Django 1.3, syntax like {% url myview %} was interpreted incorrectly (Django considered "myview" to be a literal name of a view, not a template variable named myview). Django 1.3 and above introduced the {% load url from future %} syntax to bring in the corrected behavior where myview was seen as a variable.

Por lo tanto, el problema es que hay una copia de los archivos de plantilla de administración en una de la carpeta de plantillas de su aplicación, que está codificada de una versión anterior de Django. Esto se hace generalmente para anular las plantillas de administrador predeterminadas. Debido al cambio incompatible hacia atrás observado, este archivo de plantilla desactualizado no se puede cargar en un entorno Django más reciente y causa el extraño error: NoReverseMatch: u'admin' is not a registered namespace.

Al cambiar el orden de TEMPLATE_LOADERS, las entradas ignorarán las modificaciones de las plantillas de administración locales a favor del archivo de plantillas predeterminado (porque las plantillas predeterminadas de Django se cargan por ruta completa con filesystem.Loader). Si las modificaciones son necesarias (que generalmente es el caso), debe actualizar los archivos de plantilla de administración local de sus nuevas plantillas de instalación de Django y volver a aplicar sus modificaciones.

Nota 1: Una situación similar ocurre cuando las plantillas de administración local son más nuevas que las predeterminadas de instalación de Django, lo que parece ser este 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 cuando se usa 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.

+1

¡Respuesta asombrosa! Desearía poder votar esto varias veces porque lo mereces. –

5

Pruebe agregar namespace = "admin" dentro del método include en el archivo urls.py.

ejemplo: url (r '^ admin /', include ("someUrlpattern", espacio de nombres = "admin"))

0

Mi solutuion era actualizar Django a la nueva cersion: pip instalación --upgrade Django == 1.6.1 antes de esto, verifique su versión instalada: congelación de pip | grep Django - Encontré que en el servidor de versiones había una versión anterior, ¡la actualización resolvió este problema!

0

Tuve un mensaje de error similar a mí porque mis direcciones URL conf tenían 2 logout URL 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'), 
]