Domanda

Il dottore Django mi dica come aggiungere un'opzione per il mio comando Django di gestione personalizzato, tramite un esempio:

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'),
    )

Poi la documentazione solo smettere. Come si potrebbe scrivere il metodo handle per questa classe per verificare se l'utente ha fornito un'opzione di --delete? A volte Django rende le cose facili difficili: - (

È stato utile?

Soluzione

Si può fare in questo modo:

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

Do atto che alcune parole chiave in Python sono riservate in modo da poter gestire quelli che utilizzano **kwargs. In caso contrario, è possibile utilizzare argomenti normali (come ho fatto con close)

Altri suggerimenti

Un piccolo suggerimento su come definire i comandi (nome della chiave, dest) e la gestione dei valori di default (in make_option e nel comando):

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 codice Django troverete "argomenti chiave" (**kwargs) spesso nominato come **options, che è più suggestiva (mi attengo a questa convenzione di denominazione).

Il valore predefinito può essere o specificata in make_option, o tramite il metodo dict.get, che consente per un valore di default.

Non c'è alcun motivo per non u utilizzare sia di default, dovrebbe il metodo Command.handle essere chiamato manualmente, dove il dizionario **options poteva mancare questa voce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top