{"title":"Bagaimana menerapkan backend cetakan disesuaikan","version":"6.0","locale":"id","docname":"howto/custom-template-backend","url":"/id/6.0/howto/custom-template-backend/","canonical":"https://djangodocs.dev/id/6.0/howto/custom-template-backend/","summary":"Backend penyesuaian Link to this heading # Ini adalah bagaimana menerapkan backend cetakan penyesuaian untuk menggunakan sistem cetakan lain. Sebuah backend cetakan…","html":"<h1>Bagaimana menerapkan backend cetakan disesuaikan<a class=\"heading-anchor\" href=\"#how-to-implement-a-custom-template-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"custom-backends\">\n<h2>Backend penyesuaian<a class=\"heading-anchor\" href=\"#custom-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ini adalah bagaimana menerapkan backend cetakan penyesuaian untuk menggunakan sistem cetakan lain. Sebuah backend cetakan adalah sebuah kelas yang mewarisi <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.backends.base.BaseEngine</span></code>. Itu harus diterapkan <code class=\"docutils literal notranslate\"><span class=\"pre\">get_template()</span></code> dan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">from_string()</span></code>. Ini adalah sebuah contoh untuk pustaka cetakan khayal <code class=\"docutils literal notranslate\"><span class=\"pre\">foobar</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.template</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateDoesNotExist</span><span class=\"p\">,</span> <span class=\"n\">TemplateSyntaxError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template.backends.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseEngine</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template.backends.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">csrf_input_lazy</span><span class=\"p\">,</span> <span class=\"n\">csrf_token_lazy</span>\n\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">foobar</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">FooBar</span><span class=\"p\">(</span><span class=\"n\">BaseEngine</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Name of the subdirectory containing the templates for this engine</span>\n    <span class=\"c1\"># inside an installed application.</span>\n    <span class=\"n\">app_dirname</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;foobar&quot;</span>\n\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=\"n\">params</span><span class=\"p\">):</span>\n        <span class=\"n\">params</span> <span class=\"o\">=</span> <span class=\"n\">params</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">()</span>\n        <span class=\"n\">options</span> <span class=\"o\">=</span> <span class=\"n\">params</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">(</span><span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">copy</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=\"n\">params</span><span class=\"p\">)</span>\n\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">engine</span> <span class=\"o\">=</span> <span class=\"n\">foobar</span><span class=\"o\">.</span><span class=\"n\">Engine</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">from_string</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">template_code</span><span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">Template</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">engine</span><span class=\"o\">.</span><span class=\"n\">from_string</span><span class=\"p\">(</span><span class=\"n\">template_code</span><span class=\"p\">))</span>\n        <span class=\"k\">except</span> <span class=\"n\">foobar</span><span class=\"o\">.</span><span class=\"n\">TemplateCompilationFailed</span> <span class=\"k\">as</span> <span class=\"n\">exc</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span><span class=\"n\">exc</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_template</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">template_name</span><span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">Template</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">engine</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"n\">template_name</span><span class=\"p\">))</span>\n        <span class=\"k\">except</span> <span class=\"n\">foobar</span><span class=\"o\">.</span><span class=\"n\">TemplateNotFound</span> <span class=\"k\">as</span> <span class=\"n\">exc</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">TemplateDoesNotExist</span><span class=\"p\">(</span><span class=\"n\">exc</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">backend</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"p\">)</span>\n        <span class=\"k\">except</span> <span class=\"n\">foobar</span><span class=\"o\">.</span><span class=\"n\">TemplateCompilationFailed</span> <span class=\"k\">as</span> <span class=\"n\">exc</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span><span class=\"n\">exc</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Template</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=\"n\">template</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">template</span> <span class=\"o\">=</span> <span class=\"n\">template</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">context</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n        <span class=\"k\">if</span> <span class=\"n\">request</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s2\">&quot;request&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">request</span>\n            <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s2\">&quot;csrf_input&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">csrf_input_lazy</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n            <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s2\">&quot;csrf_token&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">csrf_token_lazy</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Lihat <a class=\"reference external\" href=\"https://github.com/django/deps/blob/main/final/0182-multiple-template-engines.rst\">DEP 182</a> untuk informasi lebih.</p>\n</section>\n<section id=\"debug-integration-for-custom-engines\">\n<span id=\"template-debug-integration\"></span><h2>Penyatuan mencari kesalahan untuk mesin disesuaikan<a class=\"heading-anchor\" href=\"#debug-integration-for-custom-engines\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Halaman mencari kesalahan Django memiliki kait untuk menyediakan informasi rinci ketika cetakan kesalahan muncul. Mesin penyesuaian cetakan dapat menggunakan kait ini untuk meningkatkan lacak kembali informasi yang muncul ke pengguna. Kait berikut tersedia:</p>\n<section id=\"template-postmortem\">\n<span id=\"id1\"></span><h3>Cetakan postmortem<a class=\"heading-anchor\" href=\"#template-postmortem\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Postmortem muncul ketika <a class=\"reference internal\" href=\"/id/6.0/topics/templates/#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">TemplateDoesNotExist</span></code></a> dimunculkan. Dia mendaftarkan mesin cetakan dan pemuat yang digunakan ketika mencoba menemukan cetakan yang diberikan. Sebagai contoh, jika dua mesin Django dikonfigurasi, postmortem akan muncul seperti:</p>\n<img alt=\"/id/6.0/_images/postmortem.png\" src=\"/id/6.0/_images/postmortem.png\" />\n<p>Mesin penyesuaian dapat mengumpulkan postmortem dengan melewatkan argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">tried</span></code> ketika memunculkan <a class=\"reference internal\" href=\"/id/6.0/topics/templates/#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">TemplateDoesNotExist</span></code></a>. Backend yang menggunakan postmortem <a class=\"reference internal\" href=\"#template-origin-api\"><span class=\"std std-ref\">should specify an origin</span></a> pada objek cetakan.</p>\n</section>\n<section id=\"contextual-line-information\">\n<h3>Informasi baris kontekstual<a class=\"heading-anchor\" href=\"#contextual-line-information\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika sebuah kesalahan terjadi selama mengurai cetakan atau sedang membangun, Django dapat menampilkan baris dari kesalahan yang terjadi. Sebagai contoh:</p>\n<img alt=\"/id/6.0/_images/template-lines.png\" src=\"/id/6.0/_images/template-lines.png\" />\n<p>Mesin penyesuaian dapat mengumpulkan informasi ini dengan mengatur atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">template_debug</span></code> pada pengecualian dimunculkan selama mengurai dan membangun. Atribut ini adalah <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict\" title=\"(di Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">dict</span></code></a> dengan nilai berikut:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'name'</span></code>: Nama dari cetakan dimana pengecualian muncul.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'message'</span></code>: Pesan pengecualian.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'source_lines'</span></code>: Baris sebelum, sesudah, dan termasuk baris pengecualian yang muncul. Ini untuk konteks, jadi itu jangan mengandung lebih dari 20 baris atau lebih.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'line'</span></code>: Baris angka dimana pengecualian muncul.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'before'</span></code>: Isi pada baris kesalahan sebelum token yang memunculkan kesalahan.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'during'</span></code>: Token yang memunculkan kesalahan.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'after'</span></code>: Isi pada baris kesalahan setelah token yang memunculkan kesalahan.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'total'</span></code>: Jumlah baris dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">source_lines</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'top'</span></code>: Baris angka dimana <code class=\"docutils literal notranslate\"><span class=\"pre\">source_lines</span></code> mulai.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'bottom'</span></code>: Baris angka dimana <code class=\"docutils literal notranslate\"><span class=\"pre\">source_lines</span></code> berakhir.</p></li>\n</ul>\n<p>Diberikan cetakan kesalahan diatas, <code class=\"docutils literal notranslate\"><span class=\"pre\">template_debug</span></code> akan berupa seperti:</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=\"p\">{</span>\n    <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/path/to/template.html&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;message&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Invalid block tag: &#39;syntax&#39;&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;source_lines&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;some</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s2\">&quot;lines</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"s2\">&quot;before</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Hello {</span><span class=\"si\">% s</span><span class=\"s2\">yntax error %} {{ world }}</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"s2\">&quot;some</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">6</span><span class=\"p\">,</span> <span class=\"s2\">&quot;lines</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"s2\">&quot;after</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">],</span>\n    <span class=\"s2\">&quot;line&quot;</span><span class=\"p\">:</span> <span class=\"mi\">4</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;before&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Hello &quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;during&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{</span><span class=\"si\">% s</span><span class=\"s2\">yntax error %}&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;after&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot; {{ world }}</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;total&quot;</span><span class=\"p\">:</span> <span class=\"mi\">9</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;bottom&quot;</span><span class=\"p\">:</span> <span class=\"mi\">9</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;top&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"origin-api-and-3rd-party-integration\">\n<span id=\"template-origin-api\"></span><h3>API asli dan penggabungan pihak-ketiga<a class=\"heading-anchor\" href=\"#origin-api-and-3rd-party-integration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Cetakan Django mempunyai objek <a class=\"reference internal\" href=\"/id/6.0/ref/templates/api/#django.template.base.Origin\" title=\"django.template.base.Origin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Origin</span></code></a> tersedia melalui atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">template.origin</span></code>. Ini mengadakan informasi pencarian kesalahan untuk ditampilkan dalam  <a class=\"reference internal\" href=\"#template-postmortem\"><span class=\"std std-ref\">template postmortem</span></a>, sama halnyadi pustaka pihak-3, seperti <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-debug-toolbar/\">Django Debug Toolbar</a>.</p>\n<p>Mesin disesuaikan dapat menyediakan informasi <code class=\"docutils literal notranslate\"><span class=\"pre\">template.origin</span></code> milik mereka sendiri dengan membuat sebuah obyek yang menentukan atribut berikut:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'name'</span></code>: Jalur penih pada cetakan.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'template_name'</span></code>: Jalur relatif ke cetakan ketika dilewatkan kedalam metode memuat cetakan.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'loader_name'</span></code>: Sebuah string pilihan mencirikan fungsi atau kelas digunakan untuk memuat cetakan misalnya <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.loaders.filesystem.Loader</span></code>.</p></li>\n</ul>\n</section>\n</section>","rootId":"how-to-implement-a-custom-template-backend","toc":[{"title":"Backend penyesuaian","anchor":"custom-backends","children":[]},{"title":"Penyatuan mencari kesalahan untuk mesin disesuaikan","anchor":"debug-integration-for-custom-engines","children":[{"title":"Cetakan postmortem","anchor":"template-postmortem","children":[]},{"title":"Informasi baris kontekstual","anchor":"contextual-line-information","children":[]},{"title":"API asli dan penggabungan pihak-ketiga","anchor":"origin-api-and-3rd-party-integration","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"Panduan Cara-cara","url":"/id/6.0/howto/"}],"prev":{"docname":"howto/overriding-templates","title":"Bagaimana mengesampingkan cetakan","url":"/id/6.0/howto/overriding-templates/"},"next":{"docname":"howto/custom-template-tags","title":"Bagaimana membuat cetakan etiket dan saringan disesuaikan","url":"/id/6.0/howto/custom-template-tags/"},"formats":{"html":"/id/6.0/howto/custom-template-backend/","markdown":"/id/6.0/howto/custom-template-backend.md","json":"/id/6.0/howto/custom-template-backend.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/howto/custom-template-backend.txt","official":"https://docs.djangoproject.com/id/6.0/howto/custom-template-backend/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}