2012-04-25 11 views
5

Tengo una pregunta sobre cómo colocar aplicaciones de django en el subdirectorio de "aplicaciones". Tengo la aplicación llamada "faktura" en una raíz_proyecto. No me gustó el hecho de que se encuentra allí y quiero almacenar todas mis aplicaciones en el subdirectorio "aplicaciones".Mover aplicaciones de django a la subcarpeta y error de url.py

Así que descubrí que podía extender el camino de python al subdirectorio "aplicaciones", así que después de buscar en Internet, agregué esta cadena a settings.py: sys.path.insert (0, os.path.join (PROJECT_PATH, "aplicaciones")). Luego agregué la aplicación a INSTALLED_APPS como "faktura". Todo funcionó sin problemas hasta que agregué url (r '^ faktura /', include ('faktura.urls')) a urls.py en la raíz. Desde entonces, Django arroja el mensaje de error "Ningún módulo llamado faktura" full taceback está aquí: http://dpaste.com/737380/

¿Qué puede estar mal aquí, por qué solo urls.py no puede encontrar la aplicación? ¿Y no puede encontrar esta aplicación si la agregué a la RUTA? Pasé una mañana tratando de descubrir qué pasa y ahora necesito tu ayuda.

Respuesta

1

para mantener sus aplicaciones Django en una subcarpeta (tales como aplicaciones /), primera añada lo siguiente a su settings.py:

import os

PROJECT_ROOT = os.path.dirname(__file__)

Luego, en manage.py:

!

Justo debajo #/usr/bin/env python complemento:

import sys

from os.path import abspath, dirname, join

from site import addsitedir

Justo antes si __name__ == "__main__": añadir:

sys.path.insert(0, join(settings.PROJECT_ROOT, "apps"))

+1

Sí esto funciona ... pero si usa - como yo lo hago - uwsgi como servidor de aplicaciones, entonces TAMBIÉN debe aplicar la inserción en el archivo wsgi.py. – Paul

+1

¿Realmente necesita las importaciones no utilizadas (addsitedir, dirname, abspath)? ¿O son sobrantes de una versión anterior de esta respuesta? –

+1

La modificación de sys.path es una mala idea. https://youtu.be/bAcfPzxB3dk?t=233 –

9

no sé por qué la respuesta anterior consiguió -1 aparte de tal algunas líneas redundantes que se pueden corregir. De todos modos, encontré un método ligeramente diferente que no implica agregar nada a la ruta de Python.

Ésta es mi estructura de directorios final, voy a explicar en un momento:

mysite 
├── mysite 
│ ├── __init__.py 
│ ├── settings.py 
│ ├── urls.py 
│ └── wsgi.py 
├── apps 
│ ├── __init__.py 
│ └── myfirstapp 
│  ├── __init__.py 
│  ├── admin.py 
│  ├── models.py 
│  ├── tests.py 
│  └── views.py 
└── manage.py 

No importa si usted acaba de crear su proyecto o si desea mover sus aplicaciones, crear el subdirectorio apps que debe contener tus aplicaciones. El truco es agregar un __init__.py a ese directorio.

mkdir apps 
touch apps/__init__.py 

Ahora puede mover las aplicaciones existentes en el subdirectorio apps. Si desea crear uno nuevo en su lugar aquí están los comandos:

python manage.py mysecondapp 
mv mysecondapp apps/ 

Advertencia: No se sienta tentado a llamar python manage.py ./apps/mysecondapp. Por alguna razón, esto elimina todas las demás aplicaciones en ese directorio. Acabo de perder un día de trabajo de esta manera.

A continuación, deberá corregir algunas importaciones.Su settings.py debe tener el prefijo apps:

INSTALLED_APPS = (
    ... 
    'apps.myfirstapp', 
    'apps.mysecondapp' 
) 

Por último, fijar de urls.py su proyecto para prefijar apps:

urlpatterns = patterns('', 
    url(r'^myfirstapp', include('apps.myfirstapp.urls')), 
    ... 
) 

Dependiendo de cómo se las escribió, es posible que también tenga que arreglar un par de importaciones dentro de su aplicación O solo usa from models import MyFirstModel o también prefiéralo usando from apps.myfirstapp.models import MyFirstModel.

En resumen, si hace que su directorio apps sea un paquete python (al agregar __init__.py), puede usarlo como parte de la ruta de importación. Esto debería funcionar independientemente del método de implementación sin configuración adicional.

+0

Me encontré con un problema que no se abordó en esta respuesta, ya que urls.py en apps/myfirstapp necesitaba tener el primer argumento de patrones (...) configurado en 'apps.myfirstapp', como antes lo movía, solo decía 'myfirstapp'. La salida de depuración de Django fue mucho menos que útil para esto. – Ethereal

+1

desde apps.myfirstapp.models import MyFirstModel no funciona en el archivo de modelos secondapps..no sé por qué .. – tyan

0

@Radu Gheorghiu's answer; No es necesario editar settings.py, y la línea de ruta de inserción se puede condensar en 1 línea de código.

sys.path.insert(0, os.path.join(os.path.dirname(__file__), "apps")) 

que proceden de esta respuesta http://obroll.com/nested-application-inside-apps-sub-folder-in-django-1-3/

+0

Por favor, no cree una respuesta en una respuesta. Si desea agregar algo a la respuesta de Radu, use la función de comentario. – Silicomancer

1

Uso BASE_DIR variable de la settings.py. Hay que ya está definido:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 

Mejor no usar el atributo __file__ en manage.py y wsgi.py, ya que se encuentran en diferentes directorios.

Por lo tanto, sólo tiene que añadir lo siguiente a manage.py y wsgi.py (y al celery.py si utiliza apio):

from django.conf import settings 
    sys.path.append(os.path.join(settings.BASE_DIR, "apps")) 

Usted va a terminar con la siguiente estructura del proyecto:

project 
├── project 
│ ├── __init__.py 
│ ├── celery.py 
│ ├── settings.py 
│ ├── urls.py 
│ └── wsgi.py 
├── apps 
│ ├── app1 
│ └── app2 
└── manage.py 
Cuestiones relacionadas