Wie verwendet man Django benutzerdefinierten Management Befehl Option?
-
25-09-2019 - |
Frage
Die Doc Django sagen Sie mir, wie eine Option, um meinen django benutzerdefinierte Management-Befehl hinzufügen, über ein Beispiel:
from optparse import make_option
class Command(BaseCommand):
option_list = BaseCommand.option_list + (
make_option('--delete',
action='store_true',
dest='delete',
default=False,
help='Delete poll instead of closing it'),
)
Dann einfach aufhören die Dokumentation. Wie würde man die handle
Methode schreibt für diese Klasse zu überprüfen, ob der Benutzer eine --delete
Option geliefert hat? Manchmal macht Django die einfachen Dinge schwierig: - (
Lösung
Sie können es tun, wie folgt:
from optparse import make_option
class Command(BaseCommand):
option_list = BaseCommand.option_list + (
make_option('--del',
action='store_true',
help='Delete poll'),
make_option('--close',
action='store_true',
help='Close poll'),
)
def handle(self, close, *args, **kwargs):
del_ = kwargs.get('del')
Zu beachten ist, dass einige Schlüsselwörter in Python reserviert sind, so dass Sie diejenigen mit **kwargs
verarbeiten können. Ansonsten können Sie normale Argumente verwenden (wie ich mit close
tat)
Andere Tipps
Ein kleiner Vorschlag über die Befehle definieren (Schlüsselname, dest
) und Umgang mit Standardwerten (in make_option
und im Befehl):
class Command(BaseCommand):
option_list = BaseCommand.option_list + (
make_option('--del',
action='store_true',
help='Delete all polls.',
dest='your_name_for_delete',
default=False),
make_option('--close',
action='store_true',
help='Close all polls.'),
)
def handle(self, close, *args, **options):
if options.get('your_name_for_delete'):
Poll.objects.delete()
if options.get('close', False):
Poll.objects.update(closed=True)
In Django Code Sie "Keyword-Argumente" finden (**kwargs
) oft als **options
genannt, die mehr suggestiv ist (I dieser Namenskonvention halten).
Der Standardwert kann entweder in make_option angegeben werden, oder durch die dict.get
Verfahren,
die ermöglicht einen Standardwert.
Es gibt keinen Grund, nicht u verwenden beide Standardwerte, sollten Sie Ihre Command.handle
Methode manuell aufgerufen werden, in dem die **options
Wörterbuch diesen Eintrag fehlt könnte.