2012-08-25 38 views
5

Tài liệu lệnh quản lý Django hiển thị tất cả các lệnh được tạo trong thư mục ứng dụng/quản lý/lệnh. Có thể đặt lệnh vào các thư mục con, như ứng dụng/quản lý/lệnh/cài đặt và ứng dụng/quản lý/lệnh/bảo trì không? Làm thế nào điều này sẽ được thực hiện?Django: chia lệnh quản lý thành các thư mục con

+1

bạn có thể cung cấp thêm chi tiết về sự cố của mình không? nó là những gì bạn đang tìm kiếm? https://docs.djangoproject.com/en/dev/howto/custom-management-commands/ – Marat

+0

Tôi muốn đặt lệnh vào các thư mục con của ứng dụng/quản lý/lệnh. Tôi đã thêm chi tiết hơn cho câu hỏi. –

Trả lời

5

Thật không may, như của Django 1.4 dường như không có cách nào để làm điều đó. Các nguồn cho django.core.management.__init__.py có phương pháp này:

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

Như bạn có thể thấy, nó chỉ xem xét các file trực tiếp bên trong thư mục commands, bỏ qua bất kỳ thư mục con. Tuy nhiên, nếu bạn "khỉ vá" chức năng này bằng cách nào đó, phần còn lại của mã nên hoạt động tốt, vì mã mà thực sự tạo ra các ví dụ Command là thế này:

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

Vì vậy, nếu bạn đã có một lệnh đặt tên subfolder.command nó sẽ tải đúng kịch bản và khởi tạo lớp phù hợp.

Từ quan điểm thực tế, tuy nhiên, tôi thấy không sử dụng làm điều đó. Chắc chắn, có "namespace'd" lệnh sẽ được tốt đẹp, nhưng bạn luôn có thể tiền tố tất cả các lệnh của bạn với một số tên nếu bạn muốn, sử dụng một cái gì đó khác như một tách (chẳng hạn như _). Độ dài tên lệnh - và số lần nhấn phím cần thiết để nhập chúng trong thiết bị đầu cuối - sẽ giống nhau ...

Các vấn đề liên quan