Menulis perintah django-admin penyesuaianLink 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.
Untuk melakukan ini, tambahkan direktori management/commands ke aplikasi. Django akan mendaftarkan sebuah perintah manage.py untuk setiap modul Python dalam direktori tersebut yang namanya tidak dimulai dengan garis bawah. Sebagai contoh:
polls/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
_private.py
closepoll.py
tests.py
views.py
Pada Python 2, pastika menyertakan berkas __init__.py dalam kedua direktori management dan management/commands seperti yang dilakukan diatas atau perintah anda tidak akan ditemukan.
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_id', nargs='+', type=int)
def handle(self, *args, **options):
for poll_id in options['poll_id']:
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 penyesuaian baru dapat dipanggil menggunakan python manage.py closepoll <poll_id>.
The handle() method takes one or more poll_ids and sets poll.opened
to False for each one. If the user referenced any nonexistent polls, a
CommandError is raised. The poll.opened attribute does not exist in
the tutorial and was added to
polls.models.Question for this example.
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_id', nargs='+', type=int)
# Named (optional) arguments
parser.add_argument(
'--delete',
action='store_true',
dest='delete',
default=False,
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 pengelolaan perintah dapat menerima beberapa pilihan awal seperti --verbosity dan --traceback.
Pengelolaan perintah dan lokalLink to this heading
Secara awal, cara BaseCommand.execute() menonaktifkan terjemahan karena beberapa perintah dikemas dengan Django melakukan beberapa tugas (sebagai contoh, membangun isi pengguna muka dan mengumpulkan basisdata) yang membutuhkan bahasa deretan karakter proyek-netral.
Jika, untuk beberapa alasan, penyesuaian pengelolaan perintah anda butuh menggunakan lokal yang tetap, anda harus secara manual mengaktif dan menonaktifkannya dalam cara handle() anda menggunakan fungsi disediakan oleh dukungan kode I18N:
from django.core.management.base import BaseCommand, CommandError
from django.utils import translation
class Command(BaseCommand):
...
can_import_settings = True
def handle(self, *args, **options):
# Activate a fixed locale, e.g. Russian
translation.activate('ru')
# Or you can activate the LANGUAGE_CODE # chosen in the settings:
from django.conf import settings
translation.activate(settings.LANGUAGE_CODE)
# Your command logic here
...
translation.deactivate()
Kebutuhan lainnya mungkin bahwa perintah anda dengan mudah harus menggunakan kumpulan lokal dalam pengaturan dan Django harus dijaga dari penonaktifannya. Anda dapat mencapainya dengan menggunakan pilihan BaseCommand.leave_locale_alone.
Ketika bekerja pada skenario yang digambarkan diatas, perhatikan akun yang sistem pengelolaan perintah khususnya harus sangat waspada tentang berjalan dalam lokal yang tidak seragam, jadi anda mungkin butuh untuk:
Pastikan pengaturan
USE_I18NselaluTrueketika menjalankan perintah (ini adalah contoh bagus dari potensial masalah berasal dari sebuah lingkungan waktu berjalan dinamis dimana perintah Django menghindari begitu saja dengan menonaktifkan terjemahan).Tinjau kode dari perintah anda dan kode dipanggil untuk perbedaan perilaku ketika lokal dirubah dan dinilai dampaknya pada perkiraan kebiasaan dari perintah anda.
PengujianLink to this heading
Informasi pada bagaimana untuk mencoba penyesuaian pengelolaan perintah dapat ditemukan dalam dokumen percobaan.
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.argsLink to this definition
Daftar deretan karakter argumen yang diterima oleh perintah, cocok untuk digunakan dalam pesan bantuan; sebagai contoh, sebuah perintah yang mengambil daftar nama aplikasi mungkin disetel ini menjadi '<app_label app_label ...>'.
- BaseCommand.can_import_settingsLink to this definition
Sebuah boolean menunjukkan apakah perintah butuh dapat mengimpor pengaturan Django; jika
True,execute()akan memeriksa bahwa ini dimungkinkan sebelum dilanjutkan. Nilai awal adalahTrue.
- 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 menyesuaiakan pesan kesalahan yang dikembalikan dalam kasus argumen yang hilang. Awalnya adalah keluaran oleh
argparse("terlalu sedikit argumen").
- BaseCommand.option_listLink to this definition
Ini adalah daftar dari pilihan
optparseyang akan diberi makan kedalam perintahOptionParseruntuk mengurai 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_system_checksLink to this definition
Sebuah boolean; jika
True, seluruh proyek Django akan diperiksa untuk masalah potensial sebelum menjalankan perintah. Nilai awal adalahTrue.
- BaseCommand.leave_locale_aloneLink to this definition
Sebuah boolean menunjukkan apakah kumpulan lokal dalam pengaturan harus dipertahankan selama menjalankan dari program daripada dipaksa disetel menjadi 'en-us'.
Nilai awal adalah
False.Pastikan anda mengetahui apa yang anda sedang mengerjakan jika anda memutuskan nilai dari pilihan ini dalam penyesuaian perintah anda jika dia dibuat basisdata yang bersifat sensitif-lokal dan isi seperti itu tidak harus mengandung terjemahan apapun (seperti itu terjadi sebagai contoh dengan django.contrib.auth permissions) ketika membuat perbedaan lokal dari standar sebenarnya 'en-us' mungkin menyebabkan efek yang tidak diinginkan. Lihat bagian Management commands and locales diatas untuk lebih lanjut.
Pilihan ini tidak dapat
Falseketika pilihancan_import_settingsdisetel menjadiFalsejuga karena mencoba menyetel lokal butuh akses ke pengaturan. Kondisi ini akan membangkitkan sebuahCommandError.
- 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 Syntax coloring 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.
CaraLink to this heading
BaseCommand mempunyai beberapa cara yang dapat dikesampingkan tetapi hanya cara handle() harus diterapkan.
- 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 mengesampingkan cara 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 mengesampingkan cara ini untuk mengembalikan versi mereka sendiri.
- BaseCommand.execute(*args, **options)Link to this definition
Coba untuk menjalankan perintah ini, melakukan pemeriksaan sistem jika dibutuhkan (sebagai pengendalian oleh
requires_system_checksattribute). Jika perintah muncul sebuahCommandError, Dia dicegat dan dicetak ke stderr.
- BaseCommand.handle(*args, **options)Link to this definition
Logika sebenarnya dari perintah. Subkelas harus menerapkan cara ini.
Dia mungkin mengembalikan sebuah deretan karakter Unicode yang akan dicetak ke
stdout(dibungkus olehBEGIN;danCOMMIT;jikaoutput_transactionadalahTrue).
- BaseCommand.check(app_configs=None, tags=None, display_num_errors=False)Link to this definition
Gunakan kerangka pemeriksaan sistem untuk memeriksa keseluruhan proyek Django untuk masalah potensial. Masalah serius muncul seperti sebuah
CommandError; peringatan dikeluarkan ke stderr; pemberitahuan kecil dikeluarkan pada stdout.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.handle_label(label, **options)Link to this definition
Melakukan tindakan perintah untuk
label, yang akan menjadi deretan karakter seperti yang diberikan pada baris perintah.
- class NoArgsCommandLink to this definition
Sebuah perintah yang tidak mengambil argumen dalam baris perintah.
Daripada menerapkan handle(), subkelas harus menerapkan handle_noargs(); handle() itu sendiri dikesampingkan untuk memastikan tidak ada argumen dilewatkan ke perintah.
- NoArgsCommand.handle_noargs(**options)Link to this definition
Melakukan tindakan perintah ini
Perintah pengecualianLink to this heading
- exception CommandErrorLink to this definition
Kelas pengecualian mengindikasikan sebuah masalah selama menjalankan perintah pengelolaan.
Jika pengecualian ini muncul selama peerjalanan dari pengelolaan perintah dari sebuah perintah baris tempat tuts, dia akan ditangkap dan dirubah menjadi pesan kesalahan tercetak yang bagus ke aliran keluaran yang sesuai (yaitu, stderr); sebagai sebuah hasil, memunculkan pengecualian ini (dengan sebuah gambaran yang mudah dimengerti dari kesalahan) adalah jalan yang dipilih untuk menunjukkan bahwa sesuatu telah salah dalam menjalankan sebuah perintah.
Jika sebuah pengelolaan perintah dipanggil dari kode melalui call_command(), itu terserah kamu untuk menangkap pengecualian ketika dibutuhkan.