2015-08-10 23 views
5

Tôi muốn gọi lệnh quản lý Django từ một trong các thử nghiệm của mình. Tôi đang sử dụng django.core.management.call_command cho việc này. Và nó không hoạt động.Lệnh gọi Django không thành công với các đối số bắt buộc bị thiếu

Tôi có lệnh với 4 đối số bắt buộc. Khi tôi gọi nó, nó than phiền tất cả các đối đang thiếu mặc dù tôi đi qua họ:

call_command('my_command', url='12', project='abc', website='zbb', title='12345') 

tôi nhận được lỗi lệnh cơ sở mà --url, --project, --website và --title bị thiếu .

Tôi không chỉ định đích khác cho các đối số này.

tôi nhìn vào nguồn call_command và xác định chính xác vấn đề để các dòng sau trong call_command:

if command.use_argparse: 
    # Use the `dest` option name from the parser option 
    opt_mapping = {sorted(s_opt.option_strings)[0].lstrip('-').replace('-', '_'): s_opt.dest 
        for s_opt in parser._actions if s_opt.option_strings} 
    arg_options = {opt_mapping.get(key, key): value for key, value in options.items()} 
    defaults = parser.parse_args(args=args) ****** THIS ***** 
    defaults = dict(defaults._get_kwargs(), **arg_options) 
    # Move positional args out of options to mimic legacy optparse 
    args = defaults.pop('args',()) 

args là các đối số vị trí truyền cho call_commands, đó là sản phẩm nào. Tôi chỉ đi qua các đối số được đặt tên. parser.parse_args than phiền các biến bắt buộc bị thiếu.

Đây là trong Django 1.8.3.

Đây là chức năng add_arguments lệnh của tôi (Tôi chỉ cần loại bỏ các dây giúp đỡ cho ngắn gọn):

def add_arguments(self, parser): 
    parser.add_argument('--url', action='store', required=True) 
    parser.add_argument('--project', action='store', required=True) 
    parser.add_argument('--continue-processing', action='store_true', default=False) 
    parser.add_argument('--website', action='store', required=True) 
    parser.add_argument('--title', action='store', required=True) 
    parser.add_argument('--duplicate', action='store_true',default=False) 
+1

hiển thị mã lệnh của bạn (ít nhất là các định nghĩa 'option_list') – Anentropic

+0

Đã thêm nguồn chức năng add_arguments. – zmbq

+0

là bạn thực sự gọi nó với 'arg1 = '12 ', arg2 =' abc ', arg3 =' zbb ', arg4 =' 12345'' từ khóa args? bạn có biết rằng đối với tùy chọn 'parser.add_argument ('- url')' từ khóa arg phải là 'url'? – Anentropic

Trả lời

3

Trên cơ sở đó đoạn mã mà bạn gửi, tôi đã kết luận trong call_command argument is required

rằng các đối số được đặt tên bắt buộc phải được chuyển qua thông qua *args, không chỉ các vị trí.

**kwargs bỏ qua trình phân tích cú pháp. Vì vậy, nó không thấy bất cứ điều gì bạn đã xác định ở đó. **kwargs có thể ghi đè các giá trị *args, nhưng *args vẫn cần một cái gì đó cho mỗi đối số bắt buộc. Nếu bạn không muốn làm điều đó, hãy tắt thuộc tính required.

+1

Có, tôi đã thấy rằng trong mã của call_command, là tốt. Đó là một lỗi trong call_command. Tôi không thể vượt qua các đối số được yêu cầu trong * args - thứ tự đúng của họ là gì?Có lẽ thứ tự tôi gọi là add_argument, có thể là cái gì khác, có thể nó phụ thuộc vào phiên bản hệ điều hành hoặc Python. Tôi không muốn mạo hiểm. – zmbq

+0

'argparse' cố gắng không nhạy cảm để đặt hàng. – hpaulj

+0

Làm cách nào để * có thể * không nhạy cảm? Nếu tôi đặt '1', '2', '3', '4' trong arg, làm thế nào nó có thể cho biết cái nào là url, cái nào là dự án, v.v ...? – zmbq

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