2012-05-13 42 views
8

Tôi có làm việc lệnh tùy chỉnh django-admin mà tôi sử dụng để điền cơ sở dữ liệu của mình với thông tin mới. Một lần nữa, tất cả mọi thứ hoạt động.Hai đối số trong lệnh tùy chỉnh django-admin

Tuy nhiên, bây giờ tôi đã thay đổi mô hình và chức năng của mình một chút để chấp nhận hai đối số dưới dạng bộ túp - tên đầu tiên họ, thay vì chỉ "tên".

Mã trước bên dưới - đang hoạt động. Chạy sử dụng "manage.py xyz name1 name2 name3 ... vv (khoảng trống giữa args khác nhau)

from django.core.management.base import BaseCommand, CommandError 
from detail.models import ABC 
from detail.parser import DEF 

class Command(BaseCommand): 
    args = '<name...>' 
    help = 'Populates the ABC class database' 

    def handle(self, *args, **options): 
     for symbol in args: 

      try: 
       info = DEF(name) 

Có thể vượt qua trên hai đối số từ lệnh tùy chỉnh django-admin nơi đối số thứ hai là tùy chọn -> tức là (đầu tiên, cuối cùng = Không có)?

Mã giả dưới đây của những gì tôi muốn chạy bằng ... "manage.py xyz (first1, last1) (first2, last2) < - hoặc một số biến thể của số này

Tôi đã thay đổi hàm DEF để chấp nhận điều này một cách thích hợp như một hàm độc lập. Tôi chỉ không chắc chắn làm thế nào tôi có thể nhận được lệnh django-admin làm việc ngay bây giờ.

Trả lời

13

Hoàn toàn có thể, mặc dù django.core.management không cung cấp công cụ cụ thể để làm như vậy. Bạn có thể phân tích cú pháp các đối số được chuyển qua đối số từ khóa args. Bạn sẽ phải đưa ra một cú pháp để làm như vậy (định nghĩa cú pháp trong thuộc tính help của lệnh có lẽ sẽ là một ý tưởng tốt).

Giả sử cú pháp là firstname.lastname, hoặc chỉ firstname trong trường hợp đó, tên cuối cùng được bỏ qua, bạn có thể làm một cái gì đó như:

def handle(self, *args, **options): 
    for arg in args: 
     try: 
      first_name, last_name = arg.split('.') 
     except ValueError: 
      first_name, last_name = arg, None 

     info = DEF(first_name, last_name) 

Và người dùng của lệnh có thể vượt qua trong lập luận như vậy:

$ python manage.py yourcommand -v=3 john.doe bill patrick.bateman 
+0

CẢM ƠN! Điều đó làm việc tốt. Tôi đã ban đầu hy vọng có hai arg riêng biệt, nhưng điều này làm việc giống nhau. – snakesNbronies

+3

@modocache -v = 3? nó sẽ làm gì? – GThamizh

+2

Câu trả lời này đã lỗi thời, django hiện có phương thức 'add_arguments' được tích hợp sẵn, được thêm vào v1.8. Xem: https://docs.djangoproject.com/en/2.0/howto/custom-management-commands/ – neuronet

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