2012-08-25 11 views
5

La documentazione dei comandi di gestione Django mostra tutti i comandi creati in una cartella app/gestione/comandi. È possibile inserire comandi in sottocartelle, come app/gestione/comandi/installazione e app/gestione/comandi/manutenzione? Come sarebbe fatto?Django: comandi di gestione divisi in sottocartelle

+1

puoi fornire maggiori dettagli sul tuo problema? è quello che stai cercando? https://docs.djangoproject.com/en/dev/howto/custom-management-commands/ – Marat

+0

Vorrei mettere i comandi in sottocartelle di app/gestione/comandi. Ho aggiunto più dettagli alla domanda. –

risposta

5

Sfortunatamente, come in Django 1.4 sembra che non ci sia modo di farlo. Le fonti per django.core.management.__init__.py hanno questo metodo:

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 [] 

Come si può vedere, si considera solo i file direttamente all'interno della cartella commands, ignorando eventuali sottocartelle. Tuttavia, se si "patch scimmia" questa funzione in qualche modo, il resto del codice dovrebbe funzionare bene, dal momento che il codice che crea effettivamente l'istanza Command è questo:

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() 

Quindi, se si ha un comando chiamato subfolder.command esso caricheresti lo script giusto e istanziato la classe giusta.

Dal punto di vista pratico, tuttavia, non vedo l'utilità di farlo. Certo, avere comandi "namespace'd" sarebbe bello, ma puoi sempre prefissare tutti i tuoi comandi con un nome se lo desideri, usando qualcos'altro come separatore (come _). La lunghezza del nome del comando e il numero di sequenze di tasti necessari per digitarli nel terminale saranno uguali ...

Problemi correlati