2012-08-25 8 views
5

Dokumentacja poleceń zarządzania Django pokazuje wszystkie polecenia tworzone w folderze app/management/commands. Czy można umieścić polecenia w podfolderach, takich jak app/management/commands/install i app/management/commands/maintenance? Jak to się stało?Django: podziel polecenia zarządzania na podfoldery

+1

Czy możesz podać więcej szczegółów na temat swojego problemu? czy tego szukasz? https://docs.djangoproject.com/en/dev/howto/custom-management-commands/ – Marat

+0

Chciałbym umieścić polecenia w podfolderach aplikacji/zarządzania/poleceń. Dodałem więcej szczegółów do pytania. –

Odpowiedz

5

Niestety, jak Django 1.4 wydaje się, że nie ma sposobu, aby to zrobić. Źródłami django.core.management.__init__.py mieć tą metodą:

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

Jak widać, to tylko uzna plików bezpośrednio w folderze commands, ignorując wszelkie podfoldery. Jednakże, jeśli „plaster małpa” funkcja ta jakoś, reszta kodu powinny działać prawidłowo, ponieważ kod, który faktycznie tworzy instancję Command to:

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

Tak więc, jeśli miał polecenie o nazwie subfolder.command go ładowałby odpowiedni skrypt i tworzył odpowiednią klasę.

Z praktycznego punktu widzenia nie widzę sensu tego robić. Oczywiście, polecenie "namespace" byłoby miłe, ale zawsze możesz poprzedzić wszystkie swoje polecenia jakąś nazwą, jeśli chcesz, używając czegoś innego jako separatora (takiego jak _). Długość nazwy polecenia - oraz liczba naciśnięć klawiszy potrzebnych do wpisania ich w terminalu - będą takie same ...

Powiązane problemy