How to create custom django-admin commandsLink to this heading
Aplikasi dapat mendaftarkan tindakan mereka sendiri dengan manage.py. Sebagai contoh, anda mungkin ingin menambahkan sebuah tindakan manage.py untuk sebuah aplikasi Django yang anda sedang sebarkan. Dalam dokumen ini, kami akan membangun sebuah penyesuaian perintah closepoll untuk aplikasi polls dari tutorial.
To do this, add a management/commands directory to the application. Django
will register a manage.py command for each Python module in that directory
whose name doesn't begin with an underscore. For example:
polls/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
_private.py
closepoll.py
tests.py
views.py
Dalam contoh ini, perintah closepoll akan dibuat tersedia pada setiap proyek yang menyertakan aplikasi polls dalam INSTALLED_APPS.
Modul _private.py tidak akan tersedia sebagai perintah pengelolaan.
Modul closepoll.py mempunyai hanya satu persyaratan -- itu harus ditentukan sebuah kelas Command yang memperpanjang BaseCommand atau satu dari subclasses nya.
Untuk menerapkan perintah, sunting polls/management/commands/closepoll.py untuk kelihatan seperti ini:
from django.core.management.base import BaseCommand, CommandError
from polls.models import Question as Poll
class Command(BaseCommand):
help = 'Closes the specified poll for voting'
def add_arguments(self, parser):
parser.add_argument('poll_ids', nargs='+', type=int)
def handle(self, *args, **options):
for poll_id in options['poll_ids']:
try:
poll = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise CommandError('Poll "%s" does not exist' % poll_id)
poll.opened = False
poll.save()
self.stdout.write(self.style.SUCCESS('Successfully closed poll "%s"' % poll_id))
Perintah baru penyesuaian dapat dipanggil menggunakan python manage.py closepoll <poll_ids>.
Metode handle() mengambil satu atau lebih poll_ids dan mensetel poll.opened menjadi False untuk masing-masing. Jika pengguna mereferensikan jajak pendapat yang tidak ada, sebuah CommandError dimunculkan. Atribut poll.opened tidak ada dalam tutorial dan telah ditambahkan pada polls.models.Question untuk contoh ini.
Menerima argumen pilihanLink to this heading
closepoll yang sama dapat dengan mudah dirubah untuk menghapus jejak pendapat yang diberikan daripada menutupnya dengan menerima tambahan pilihan baris perintah. Penyesuaian pilihan ini dapat ditambahkan dalam cara add_arguments() seperti ini:
class Command(BaseCommand):
def add_arguments(self, parser):
# Positional arguments
parser.add_argument('poll_ids', nargs='+', type=int)
# Named (optional) arguments
parser.add_argument(
'--delete',
action='store_true',
help='Delete poll instead of closing it',
)
def handle(self, *args, **options):
# ...
if options['delete']:
poll.delete()
# ...
Pilihan (delete dalam contoh kami) tersedia dalam pilihan parameter perintah dari cara penanganan. Lihat dokumentasi Python argparse untuk lebih tentang penggunaan add_argument.
Dalam tambahan untuk dapat menambahkan penyesuaian pilihan baris perintah, semua management commands dapat menerima beberapa pilihan awal seperti --verbosity dan --traceback.
Pengelolaan perintah dan lokalLink to this heading
Secara awalan, perintah pengelolaan dijalankan dengan lokal aktif saat ini.
Jika, untuk beberapa alasan, perintah pengelolaan penyesuaian anda harus berjalan tanpa lokal aktif (sebagai contoh, untuk menghindari isi diterjemahkan dari menjadi dimasukkan kedalam basisdata), non aktifkan terjemahan menggunakan decorator @no_translations pada metode handle() anda:
from django.core.management.base import BaseCommand, no_translations
class Command(BaseCommand):
...
@no_translations
def handle(self, *args, **options):
...
Sejak penonaktifan terjemahan membutuhkan akses untuk mengkonfigurasi pengaturan, decorator tidak dapat digunakan untuk perintah yang bekerja tanpa pengaturan yang dikonfigurasikan.
PengujianLink to this heading
Informasi pada bagaimana untuk mencoba penyesuaian pengelolaan perintah dapat ditemukan dalam dokumen percobaan.
Menimpa perintahLink to this heading
Django mendaftarkan perintah siap-pakai dan kemudian mencari untuk perintah dalam INSTALLED_APPS secara memutar. Selama pencarian, jika sebuah nama perintah menggandakan sebuah perintah sudah terdaftar, perintah baru yang ditemukan ditimpa dahulu.
Dengan kata lain, untuk menimpa sebuah perintah, perintah baru harus memiliki nama sama dan aplikasinya harus sebelum menimpa aplikasi perintah dalam INSTALLED_APPS.
Perintah pengelolaan dari aplikasi pihak-ketiga yang telah tidak sengaja ditimpa dapat dibuat tersedia dibawah sebuah nama baru dengan membuat perintah baru di satu dari aplikasi proyek anda (diurutkan sebelum aplikasi pihak-ketiga dalam INSTALLED_APPS) yang mengimpor Command dari perintah ditimpa.
Obyek perintahLink to this heading
- class BaseCommandLink to this definition
Kelas dasar dari mana semua pengelolaan perintah akhirnya berasal.
Gunakan kelas ini jika anda ingin mengakses semua mekanisme yang mengurai argumen baris perintah dan bekerja kode apa untuk dipanggil dalam tanggapan; jika anda tidak butuh merubah kebiasaan apapun, pertimbangkan menggunakan satu dari subclasses nya.
Mensubkelaskan kelas BaseCommand membutuhkan bahwa anda menerapkan cara handle().
AtributLink to this heading
Semua atribut dapat di setel dalam kelas turunan anda dan dapat digunakan dalam subclasses BaseCommand.
- BaseCommand.helpLink to this definition
Deskripsi singkat dari perintah, dimana akan ditampilkan di pesan bantuan ketika pengguna eksekusi perintah
python manage.py help <command>.
- BaseCommand.missing_args_messageLink to this definition
Jika perintah anda menentukan argumen penempatan wajib, anda dapat menyesuaikan pesan kesalahan yang dikembalikan dalam kasus argumen yang hilang. Awalnya adalah keluaran oleh
argparse("terlalu sedikit argumen").
- BaseCommand.output_transactionLink to this definition
Sebuah boolean menunjukkan apakah perintah keluaran pernyataan SQL; jika
True, keluaran akan otomatis dibungkus denganBEGIN;danCOMMIT;. Nilai awal adalahFalse.
- BaseCommand.requires_migrations_checksLink to this definition
Sebuah boolean; jika
True, memerintahkan mencetak sebuah peringatan jika pengaturan perpindahan pada cakram tidak cocok dengan perpindahan di basisdata. Sebuah peringatan tidak mencegah perintah dari penjalanan. Nilai awal adalahFalse.
- BaseCommand.requires_system_checksLink to this definition
A list or tuple of tags, e.g.
[Tags.staticfiles, Tags.models]. System checks registered in the chosen tags will be checked for errors prior to executing the command. The value'__all__'can be used to specify that all system checks should be performed. Default value is'__all__'.
- BaseCommand.styleLink to this definition
Sebuah atribut instance yang membantu membuat keluaran bewarna ketika menulis ke
stdoutataustderr. Sebagai contoh:self.stdout.write(self.style.SUCCESS('...'))Lihat Pewarnaan sintaksis untuk mempelajari bagaimana merubah papan warna dan melihat gaya tersedia (gunakan versi huruf besar dari "roles" yang digambarkan dalam bagian itu).
Jika anda melewati pilihan
--no-colorketika menjalankan perintah anda, semua pemanggilanself.style()akan mengembalikan deretan karakter asli tidak bewarna.
- BaseCommand.suppressed_base_argumentsLink to this definition
-
The default command options to suppress in the help output. This should be a set of option names (e.g.
'--verbosity'). The default values for the suppressed options are still passed.
CaraLink to this heading
BaseCommand mempunyai beberapa cara yang dapat dikesampingkan tetapi hanya cara handle() harus diterapkan.
- BaseCommand.create_parser(prog_name, subcommand, **kwargs)Link to this definition
Mengembalikan instance
CommandParser, yaitu sebuah subkelasArgumentParserdengan sedikit penyesuaian untuk Django.Anda dapat menyesuaikan instance dengan menimpa metode ini dan memanggil
super()dengankwargsdari parameterArgumentParser.
- BaseCommand.add_arguments(parser)Link to this definition
Titik masukan untuk menambahkan pengurai argumen untuk menangani argumen baris perintah dilewati ke perintah. Penyesuaian perintah harus menimpa metode ini untuk menambah kedua argumen penempatan dan pilihan yang diterima oleh perintah. Memanggil
super()tidak dibutuhkan ketika pengsubkelasan secara langsungBaseCommand.
- BaseCommand.get_version()Link to this definition
Mengembalikan versi Django, yang seharusnya benar untuk semua perintah Django siap pakai. Perintah pasokan-pengguna dapat menimpa metode ini untuk mengembalikan versi mereka sendiri.
- BaseCommand.execute(*args, **options)Link to this definition
Tries to execute this command, performing system checks if needed (as controlled by the
requires_system_checksattribute). If the command raises aCommandError, it's intercepted and printed tostderr.
- BaseCommand.handle(*args, **options)Link to this definition
Logika sebenarnya dari perintah. Subkelas harus menerapkan cara ini.
Itu mungkin mengembalikan sebuah string yang akan dicetak pada
stdout(dibungkus olehBEGIN;danCOMMIT;jikaoutput_transactionadalahTrue).
- BaseCommand.check(app_configs=None, tags=None, display_num_errors=False)Link to this definition
Uses the system check framework to inspect the entire Django project for potential problems. Serious problems are raised as a
CommandError; warnings are output tostderr; minor notifications are output tostdout.Jika
app_configsdantagskeduanyaNone, semua pemeriksaan sistem dilakukan.tagsdapat menjadi daftar dari etiket pemeriksaan, seperticompatibilityataumodels.
Subkelas BaseCommandLink to this heading
- class AppCommandLink to this definition
Sebuah pengelolaan perintah yang mengambil satu atau lebih label aplikasi terpasang sebagai argumen, dan melakukan sesuatu dengan masing-masing dari mereka.
Daripada menerapkan handle(), subkelas harus menerapkan handle_app_config(), yang akan dipanggil sekali untuk setiap aplikasi.
- AppCommand.handle_app_config(app_config, **options)Link to this definition
Melakukan tindakan perintah untuk
app_config, yang akan menjadi sebuah instanceAppConfigterhubung ke sebuah label aplikasi yang diberikan pada baris perintah.
- class LabelCommandLink to this definition
Sebuah pengelolaan perintah yang mengambil satu atau lebih argumen (label) yang berubah-ubah pada baris perintah, dan melakukan sesuatu dengan masing-masing dari mereka.
Daripada menerapkan handle(), subkelas harus menerapkan handle_label(), yang akan dipanggil sekali untuk setiap label.
- LabelCommand.labelLink to this definition
Sebuah string menggambarkan argumenberubah-ubah dilewatkan ke perintah. String digunakan dalam penggunaan teks dan pesan kesalahan dari perintah. Awalan pada
'label'.
- LabelCommand.handle_label(label, **options)Link to this definition
Melakukan tindakan perintah untuk
label, yang akan menjadi deretan karakter seperti yang diberikan pada baris perintah.
Perintah pengecualianLink to this heading
- exception CommandError(returncode=1)Link to this definition
Kelas pengecualian mengindikasikan sebuah masalah selama menjalankan perintah pengelolaan.
If this exception is raised during the execution of a management command from a
command line console, it will be caught and turned into a nicely-printed error
message to the appropriate output stream (i.e., stderr); as a result,
raising this exception (with a sensible description of the error) is the
preferred way to indicate that something has gone wrong in the execution of a
command. It accepts the optional returncode argument to customize the exit
status for the management command to exit with, using sys.exit().
Jika sebuah pengelolaan perintah dipanggil dari kode melalui call_command(), itu terserah kamu untuk menangkap pengecualian ketika dibutuhkan.