{"title":"Kerangka sistem pemeriksaan","version":"6.0","locale":"id","docname":"topics/checks","url":"/id/6.0/topics/checks/","canonical":"https://djangodocs.dev/id/6.0/topics/checks/","summary":"Kerangka sistem pemeriksaan adalah kumpulan dari pemeriksaan tetap untuk memeriksa kebenaran proyek Django. Dia menemukan masalah umum dan menyediakan petunjuk…","html":"<span id=\"system-check-framework\"></span><h1>Kerangka sistem pemeriksaan<a class=\"heading-anchor\" href=\"#module-django.core.checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Kerangka sistem pemeriksaan adalah kumpulan dari pemeriksaan tetap untuk memeriksa kebenaran proyek Django. Dia menemukan masalah umum dan menyediakan petunjuk untuk bagaimana memperbaiki mereka. Kerangka ini dapat diperpanjang sehingga anda dapat dengan mudah menambahkan pemeriksaan anda sendiri.</p>\n<p>Pemeriksaan dapat dibangkitkan jelas melalui perintah <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">check</span></code></a>. Pemeriksaan dipicu tidak langsung sebelum kebanyakan perintah, termasuk <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a> dan <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>. Untuk alasan penampilan, pemeriksaan tidak berjalan sebagai bagian dari tumpukan WSGI yang digunakan dalam pengembangan. Jika anda butuh menjalankan pemeriksaan sistem pada peladen pengembangan anda, picu mereka dengan jelas menggunakan <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">check</span></code></a>.</p>\n<p>Kesalahan-kesalahan serius akan mencegah perintah Django (seperti <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a>) dari menjalankan sama sekali. Masalah-masalah dilaporkan ke konsol. Jika anda telah memeriksa penyebab dari peringatan dan senang mengabaikan itu, anda dapat memyembunyikan peringatan khusus menggunakan pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-SILENCED_SYSTEM_CHECKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SILENCED_SYSTEM_CHECKS</span></code></a> di berkas pengaturan proyek anda.</p>\n<p>Sebuah daftar penuh dari semua pemeriksaan yang dapat dimunculkan oleh Django dapat ditemukan di <a class=\"reference internal\" href=\"/id/6.0/ref/checks/\"><span class=\"doc\">System check reference</span></a>.</p>\n<section id=\"writing-your-own-checks\">\n<h2>Menulis pemeriksaan anda sendiri<a class=\"heading-anchor\" href=\"#writing-your-own-checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Kerangka kerja fleksibel dan mengizinkan anda menulis fungsi-fungsi yang melakukan jenis lain pemeriksaan anda mungkin butuhkan. Berikut adalah sebuah contoh potongan fungsi pemeriksaan:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.checks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Error</span><span class=\"p\">,</span> <span class=\"n\">register</span>\n\n\n<span class=\"nd\">@register</span><span class=\"p\">()</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">example_check</span><span class=\"p\">(</span><span class=\"n\">app_configs</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"n\">errors</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"c1\"># ... your check logic here</span>\n    <span class=\"k\">if</span> <span class=\"n\">check_failed</span><span class=\"p\">:</span>\n        <span class=\"n\">errors</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span>\n            <span class=\"n\">Error</span><span class=\"p\">(</span>\n                <span class=\"s2\">&quot;an error&quot;</span><span class=\"p\">,</span>\n                <span class=\"n\">hint</span><span class=\"o\">=</span><span class=\"s2\">&quot;A hint.&quot;</span><span class=\"p\">,</span>\n                <span class=\"n\">obj</span><span class=\"o\">=</span><span class=\"n\">checked_object</span><span class=\"p\">,</span>\n                <span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"s2\">&quot;myapp.E001&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">)</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">errors</span>\n</code></pre></div>\n<p>The check function <em>must</em> accept an <code class=\"docutils literal notranslate\"><span class=\"pre\">app_configs</span></code> argument; this argument is\nthe list of applications that should be inspected. If <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, the check must\nbe run on <em>all</em> installed apps in the project.</p>\n<p>The check will receive a <code class=\"docutils literal notranslate\"><span class=\"pre\">databases</span></code> keyword argument. This is a list of\ndatabase aliases whose connections may be used to inspect database level\nconfiguration. If <code class=\"docutils literal notranslate\"><span class=\"pre\">databases</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, the check must not use any\ndatabase connections.</p>\n<p>Argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code> diperlukan untuk perluasan di masa mendatang.</p>\n<section id=\"messages\">\n<h3>Pesan<a class=\"heading-anchor\" href=\"#messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Fungsi harus mengembalikan sebuah daftar pesan. Jika tidak ada masalah ditemukan sebagai hasil dari pemeriksaan, fungsi pemeriksaaan harus mengembalikan sebuah daftar kosong.</p>\n<p>Peringatan dan kesalahan dimunculkan oleh metode pemeriksaan harus berupa instance dari <a class=\"reference internal\" href=\"/id/6.0/ref/checks/#django.core.checks.CheckMessage\" title=\"django.core.checks.CheckMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CheckMessage</span></code></a>. Sebuah instance dari <a class=\"reference internal\" href=\"/id/6.0/ref/checks/#django.core.checks.CheckMessage\" title=\"django.core.checks.CheckMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CheckMessage</span></code></a> membungkus kesalahan tunggal dilaporkan atau peringatan. Itu juga menyediakan konteks dan petunjuk dapat diterapkan ke pesan, dan penciri unik yang digunakan untuk tujuan penyaringan.</p>\n<p>Konsep sangat mirip ke pasan dari <a class=\"reference internal\" href=\"/id/6.0/ref/contrib/messages/\"><span class=\"doc\">message framework</span></a> atau the <a class=\"reference internal\" href=\"/id/6.0/topics/logging/\"><span class=\"doc\">logging framework</span></a>. Pesan-pesan dietiket dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> menunjukkan kekerasan pesan.</p>\n<p>Ada juga jalan pintas untuk membuat pesan dengan tingkatan umum lebih mudah. Ketika menggunakan kelas-kelas ini anda dapat menghilangkan argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> karena itu disisipkan oleh nama kelas.</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/checks/#django.core.checks.Debug\" title=\"django.core.checks.Debug\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Debug</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/checks/#django.core.checks.Info\" title=\"django.core.checks.Info\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Info</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/checks/#django.core.checks.Warning\" title=\"django.core.checks.Warning\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Warning</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/checks/#django.core.checks.Error\" title=\"django.core.checks.Error\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Error</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/checks/#django.core.checks.Critical\" title=\"django.core.checks.Critical\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Critical</span></code></a></p></li>\n</ul>\n</section>\n<section id=\"registering-and-labeling-checks\">\n<span id=\"registering-labeling-checks\"></span><h3>Mendaftarkan dan melabeli pemeriksaan<a class=\"heading-anchor\" href=\"#registering-and-labeling-checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Akhirnya, fungsi pemeriksaan anda harus terdaftar jelas dengan sistem pemeriksaan regristrar. Pemeriksaan harus didaftarkan dalam sebuah berkas yang dimuat ketika aplikasi anda dimuat; sebagai contoh, di metode <a class=\"reference internal\" href=\"/id/6.0/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AppConfig.ready()</span></code></a>.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.checks.register\">\n<span class=\"sig-name descname\"><span class=\"pre\">register</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">*tags)(function</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.checks.register\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Anda dapat melewatkan sebanyak etiket ke <code class=\"docutils literal notranslate\"><span class=\"pre\">register</span></code> seperti anda inginkan untuk melabelkan pemeriksaan anda. Pemeriksaan etiket sangat berguna sejak itu mengizinkan anda menjalankan hanya kelompok tertentu dari pemeriksaan. Sebagai contoh, untuk mendaftar pemeriksaan kesesuaian, anda akan membuat panggilan berikut:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.checks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">register</span><span class=\"p\">,</span> <span class=\"n\">Tags</span>\n\n\n<span class=\"nd\">@register</span><span class=\"p\">(</span><span class=\"n\">Tags</span><span class=\"o\">.</span><span class=\"n\">compatibility</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_check</span><span class=\"p\">(</span><span class=\"n\">app_configs</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ... perform compatibility checks and collect errors</span>\n    <span class=\"k\">return</span> <span class=\"n\">errors</span>\n</code></pre></div>\n<p>Anda dapat mendaftar &quot;deployment checks&quot; yang hanya bersangkutan pada berkas pengaturan produksi seperti ini:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"p\">(</span><span class=\"n\">Tags</span><span class=\"o\">.</span><span class=\"n\">security</span><span class=\"p\">,</span> <span class=\"n\">deploy</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_check</span><span class=\"p\">(</span><span class=\"n\">app_configs</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Pemeriksaan ini hanya akan dijalankan jika pilihan <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#cmdoption-check-deploy\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">check</span> <span class=\"pre\">--deploy</span></code></a> digunakan.</p>\n<p>Anda dapat juga menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">register</span></code> sebagai sebuah fungsi daripada sebuah penghias dengan melewatkan obyek callable (biasanya sebuah fungsi) sebagai argumen pertama pada <code class=\"docutils literal notranslate\"><span class=\"pre\">register</span></code></p>\n<p>Kode dibawah ini setara dengan kode diatas:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_check</span><span class=\"p\">(</span><span class=\"n\">app_configs</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">my_check</span><span class=\"p\">,</span> <span class=\"n\">Tags</span><span class=\"o\">.</span><span class=\"n\">security</span><span class=\"p\">,</span> <span class=\"n\">deploy</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"field-constraint-model-manager-template-engine-task-and-database-checks\">\n<span id=\"field-checking\"></span><h3>Field, constraint, model, manager, template engine, task, and database checks<a class=\"heading-anchor\" href=\"#field-constraint-model-manager-template-engine-task-and-database-checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Dalam beberapa kasus, anda tidak butuh mendaftar fungsi pemeriksaan anda -- anda dapat mendukung pada pendaftaran yang ada.</p>\n<p>Fields, constraints, models, model managers, template engines, task backends,\nand database backends all implement a <code class=\"docutils literal notranslate\"><span class=\"pre\">check()</span></code> method that is already\nregistered with the check framework. If you want to add extra checks, you can\nextend the implementation on the base class, perform any extra checks you need,\nand append any messages to those generated by the base class. It's recommended\nthat you delegate each check to separate methods.</p>\n<p>Pertimbangkan sebuah contoh dimana anda sedang menerapkan bidang penyesuaian bernama <code class=\"docutils literal notranslate\"><span class=\"pre\">RangedIntegerField</span></code>. Bidang ini menambahkan argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">min</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">max</span></code> pada pembangun dari <code class=\"docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code>. Anda mungkin ingin menambah sebuah pemeriksaan untuk memastikan bahwa pengguna menyediakan nilai minimal yang kurang atau setara pada nilai maksimal. Potongan kode berikut menunjukkan anda dapat menerapkan pemeriksaan ini:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">checks</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">RangedIntegerField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"nb\">min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"nb\">max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">min</span> <span class=\"o\">=</span> <span class=\"nb\">min</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max</span> <span class=\"o\">=</span> <span class=\"nb\">max</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Call the superclass</span>\n        <span class=\"n\">errors</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">check</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Do some custom checks and add messages to `errors`:</span>\n        <span class=\"n\">errors</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_check_min_max_values</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">))</span>\n\n        <span class=\"c1\"># Return all errors and warnings</span>\n        <span class=\"k\">return</span> <span class=\"n\">errors</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_check_min_max_values</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">min</span> <span class=\"o\">&gt;</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[</span>\n                <span class=\"n\">checks</span><span class=\"o\">.</span><span class=\"n\">Error</span><span class=\"p\">(</span>\n                    <span class=\"s2\">&quot;min greater than max.&quot;</span><span class=\"p\">,</span>\n                    <span class=\"n\">hint</span><span class=\"o\">=</span><span class=\"s2\">&quot;Decrease min or increase max.&quot;</span><span class=\"p\">,</span>\n                    <span class=\"n\">obj</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                    <span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"s2\">&quot;myapp.E001&quot;</span><span class=\"p\">,</span>\n                <span class=\"p\">)</span>\n            <span class=\"p\">]</span>\n        <span class=\"c1\"># When no error, return an empty list</span>\n        <span class=\"k\">return</span> <span class=\"p\">[]</span>\n</code></pre></div>\n<p>Jika anda ingin menambah pemeriksaan pada pengelola model, anda akan mengambil pendekatan sama pada subkelas anda dari <a class=\"reference internal\" href=\"/id/6.0/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Manager</span></code></a>.</p>\n<p>Jika anda ingin menambah sebuah pemeriksaan pada kelas model, pendekatan adalah <em>hampir</em> sama: perbedaan hanya bahwa pemeriksaan adalah metode kelas, bukan metode instance:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"nd\">@classmethod</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">errors</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">check</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"c1\"># ... your own checks ...</span>\n        <span class=\"k\">return</span> <span class=\"n\">errors</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"6.0\">\n<p class=\"version-note-title\">Changed in Django 6.0</p><p>In older versions, constraints didn't implement a <code class=\"docutils literal notranslate\"><span class=\"pre\">check()</span></code> method.</p>\n</aside>\n</section>\n<section id=\"writing-tests\">\n<h3>Menulis percobaan<a class=\"heading-anchor\" href=\"#writing-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pesan dapat dibandingkan. Itu mengizinakan anda dengan mudah menulis percobaan:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.checks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Error</span>\n\n<span class=\"n\">errors</span> <span class=\"o\">=</span> <span class=\"n\">checked_object</span><span class=\"o\">.</span><span class=\"n\">check</span><span class=\"p\">()</span>\n<span class=\"n\">expected_errors</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">Error</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;an error&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">hint</span><span class=\"o\">=</span><span class=\"s2\">&quot;A hint.&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">obj</span><span class=\"o\">=</span><span class=\"n\">checked_object</span><span class=\"p\">,</span>\n        <span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"s2\">&quot;myapp.E001&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n<span class=\"p\">]</span>\n<span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">errors</span><span class=\"p\">,</span> <span class=\"n\">expected_errors</span><span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"writing-integration-tests\">\n<h4>Writing integration tests<a class=\"heading-anchor\" href=\"#writing-integration-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Given the need to register certain checks when the application loads, it can be\nuseful to test their integration within the system checks framework. This can\nbe accomplished by using the <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django.core.management.call_command\" title=\"django.core.management.call_command\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">call_command()</span></code></a>\nfunction.</p>\n<p>For example, this test demonstrates that the <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting must be\nan integer, a built-in <a class=\"reference internal\" href=\"/id/6.0/ref/checks/#sites-system-checks\"><span class=\"std std-ref\">check from the sites framework</span></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.management</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">call_command</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.management.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SystemCheckError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span><span class=\"p\">,</span> <span class=\"n\">modify_settings</span><span class=\"p\">,</span> <span class=\"n\">override_settings</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SystemCheckIntegrationTest</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@override_settings</span><span class=\"p\">(</span><span class=\"n\">SITE_ID</span><span class=\"o\">=</span><span class=\"s2\">&quot;non_integer&quot;</span><span class=\"p\">)</span>\n    <span class=\"nd\">@modify_settings</span><span class=\"p\">(</span><span class=\"n\">INSTALLED_APPS</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;prepend&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.contrib.sites&quot;</span><span class=\"p\">})</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_non_integer_site_id</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;(sites.E101) The SITE_ID setting must be an integer.&quot;</span>\n        <span class=\"k\">with</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertRaisesMessage</span><span class=\"p\">(</span><span class=\"n\">SystemCheckError</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"p\">):</span>\n            <span class=\"n\">call_command</span><span class=\"p\">(</span><span class=\"s2\">&quot;check&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Consider the following check which issues a warning on deployment if a custom\nsetting named <code class=\"docutils literal notranslate\"><span class=\"pre\">ENABLE_ANALYTICS</span></code> is not set to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.checks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"ne\">Warning</span><span class=\"p\">,</span> <span class=\"n\">register</span>\n\n\n<span class=\"nd\">@register</span><span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"n\">deploy</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">check_enable_analytics_is_true_on_deploy</span><span class=\"p\">(</span><span class=\"n\">app_configs</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"n\">errors</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">if</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"p\">,</span> <span class=\"s2\">&quot;ENABLE_ANALYTICS&quot;</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n        <span class=\"n\">errors</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span>\n            <span class=\"ne\">Warning</span><span class=\"p\">(</span>\n                <span class=\"s2\">&quot;The ENABLE_ANALYTICS setting should be set to True in deployment.&quot;</span><span class=\"p\">,</span>\n                <span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"s2\">&quot;myapp.W001&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">)</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">errors</span>\n</code></pre></div>\n<p>Given that this check will not raise a <code class=\"docutils literal notranslate\"><span class=\"pre\">SystemCheckError</span></code>, the presence of\nthe warning message in the <code class=\"docutils literal notranslate\"><span class=\"pre\">stderr</span></code> output can be asserted like so:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">io</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">StringIO</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.management</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">call_command</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span><span class=\"p\">,</span> <span class=\"n\">override_settings</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">EnableAnalyticsDeploymentCheckTest</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@override_settings</span><span class=\"p\">(</span><span class=\"n\">ENABLE_ANALYTICS</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_when_set_to_none</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">stderr</span> <span class=\"o\">=</span> <span class=\"n\">StringIO</span><span class=\"p\">()</span>\n        <span class=\"n\">call_command</span><span class=\"p\">(</span><span class=\"s2\">&quot;check&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;-t&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;--deploy&quot;</span><span class=\"p\">,</span> <span class=\"n\">stderr</span><span class=\"o\">=</span><span class=\"n\">stderr</span><span class=\"p\">)</span>\n        <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n            <span class=\"s2\">&quot;(myapp.W001) The ENABLE_ANALYTICS setting should be set &quot;</span>\n            <span class=\"s2\">&quot;to True in deployment.&quot;</span>\n        <span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertIn</span><span class=\"p\">(</span><span class=\"n\">message</span><span class=\"p\">,</span> <span class=\"n\">stderr</span><span class=\"o\">.</span><span class=\"n\">getvalue</span><span class=\"p\">())</span>\n</code></pre></div>\n</section>\n</section>\n</section>","rootId":"module-django.core.checks","toc":[{"title":"Menulis pemeriksaan anda sendiri","anchor":"writing-your-own-checks","children":[{"title":"Pesan","anchor":"messages","children":[]},{"title":"Mendaftarkan dan melabeli pemeriksaan","anchor":"registering-and-labeling-checks","children":[]},{"title":"Field, constraint, model, manager, template engine, task, and database checks","anchor":"field-constraint-model-manager-template-engine-task-and-database-checks","children":[]},{"title":"Menulis percobaan","anchor":"writing-tests","children":[{"title":"Writing integration tests","anchor":"writing-integration-tests","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/6.0/topics/"}],"prev":{"docname":"topics/signals","title":"Sinyal","url":"/id/6.0/topics/signals/"},"next":{"docname":"topics/external-packages","title":"Paket eksternal","url":"/id/6.0/topics/external-packages/"},"formats":{"html":"/id/6.0/topics/checks/","markdown":"/id/6.0/topics/checks.md","json":"/id/6.0/topics/checks.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/checks.txt","official":"https://docs.djangoproject.com/id/6.0/topics/checks/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}