2012-08-25 19 views
5

La documentación de los comandos de administración de Django muestra todos los comandos que se están creando en una carpeta de aplicaciones/administración/comandos. ¿Es posible poner comandos en subcarpetas, como app/management/commands/install y app/management/commands/maintenance? ¿Cómo se haría esto?Django: dividir los comandos de administración en las subcarpetas

+1

¿Puede dar más detalles sobre su problema? es lo que estás buscando? https://docs.djangoproject.com/en/dev/howto/custom-management-commands/ – Marat

+0

Me gustaría poner comandos en las subcarpetas de la aplicación/gestión/comandos. He agregado más detalles a la pregunta. –

Respuesta

5

Desafortunadamente, a partir de Django 1.4 no parece haber forma de hacerlo. Las fuentes para django.core.management.__init__.py tienen este método:

def find_commands(management_dir): 
    """ 
    Given a path to a management directory, returns a list of all the command 
    names that are available. 

    Returns an empty list if no commands are defined. 
    """ 
    command_dir = os.path.join(management_dir, 'commands') 
    try: 
     return [f[:-3] for f in os.listdir(command_dir) 
       if not f.startswith('_') and f.endswith('.py')] 
    except OSError: 
     return [] 

Como se puede ver, sólo considera los archivos directamente dentro de la carpeta commands, haciendo caso omiso de todas las subcarpetas. Sin embargo, si "parche mono" esta función alguna manera, el resto del código debería funcionar bien, ya que el código que realmente crea la instancia Command es la siguiente:

def load_command_class(app_name, name): 
    """ 
    Given a command name and an application name, returns the Command 
    class instance. All errors raised by the import process 
    (ImportError, AttributeError) are allowed to propagate. 
    """ 
    module = import_module('%s.management.commands.%s' % (app_name, name)) 
    return module.Command() 

lo tanto, si usted tenía un comando llamado subfolder.command se cargaría la secuencia de comandos correcta y crearía una instancia de la clase correcta.

Desde un punto de vista práctico, sin embargo, no veo el uso de hacer eso. Claro, tener comandos de "espacio de nombres" sería agradable, pero siempre puedes prefijar todos tus comandos con algún nombre si lo deseas, usando algo más como separador (como _). La longitud del nombre del comando - y el número de teclas necesarias para escribirlos en el terminal - será la misma ...

Cuestiones relacionadas