2012-05-13 9 views
8

Ich habe eine arbeiten django-admin benutzerdefinierten Befehl, den ich verwenden, um meine Datenbank mit neuen Informationen zu füllen. Auch hier funktioniert alles.Zwei Argumente in django-admin benutzerdefinierten Befehl

Allerdings habe ich jetzt meine Modelle geändert und funktionieren etwas, um zwei Argumente als Tupel zu akzeptieren - Vorname und Nachname, anstatt nur "Name".

Vorheriger Code unten - funktioniert. Führen Sie mit „manage.py xyz name1 name2 name3 ... usw. (Raum zwischen den verschiedenen args)

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) 

Ist es möglich, auf zwei Argumente aus dem django-admin benutzerdefinierten Befehl zu übergeben, wo das zweite Argument optional -> ie (first, last = None)?

Pseudocode unterhalb von dem, was ich gerne mit ... "manage.py xyz (first1, last1) (first2, last2) < - oder eine Variante davon

Ich habe bereits die Funktion DEF geändert, um dies als eigenständige Funktion zu akzeptieren. Ich bin mir nur nicht sicher, wie ich den django-admin-Befehl jetzt zum Laufen bringen kann.

Antwort

13

Es ist durchaus möglich, obwohl django.core.management kein spezielles Tool dafür bietet. Sie können die über das Schlüsselwortargument args übergebenen Argumente analysieren. Sie müssen eine Syntax dafür finden (das Definieren der Syntax im help Attribut des Befehls wäre wahrscheinlich eine gute Idee).

Unter der Annahme, die Syntax ist firstname.lastname, oder einfach nur firstname in dem Fall, dass der letzte Name nicht angegeben, Sie so etwas wie tun:

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) 

und Benutzer des Befehls in Argumenten wie so passieren kann:

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

DANKE! Das hat gut funktioniert. Ich hatte ursprünglich gehofft, zwei getrennte Argumente zu haben, aber das funktioniert genauso. – snakesNbronies

+3

@modocache -v = 3? was wird es tun? – GThamizh

+2

Diese Antwort ist veraltet, django verfügt jetzt über eine 'add_arguments'-Methode, die in Version 1.8 hinzugefügt wurde. Siehe: https://docs.djangoproject.com/de/2.0/howto/custom-management-commands/ – neuronet

Verwandte Themen