{"title":"Bagaimana menerapkan backend cetakan disesuaikan","version":"5.0","locale":"id","docname":"howto/custom-template-backend","url":"/id/5.0/howto/custom-template-backend/","canonical":"https://djangodocs.dev/id/5.0/howto/custom-template-backend/","summary":"Ini adalah bagaimana menerapkan backend cetakan penyesuaian untuk menggunakan sistem cetakan lain.","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\">django.template.backends.base.BaseEngine</code>. Itu harus diterapkan <code class=\"docutils literal notranslate\">get_template()</code> dan pilihan <code class=\"docutils literal notranslate\">from_string()</code>. Ini adalah sebuah contoh untuk pustaka cetakan khayal <code class=\"docutils literal notranslate\">foobar</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=\"nn\">django.template</span> <span class=\"kn\">import</span> TemplateDoesNotExist<span class=\"p\">,</span> TemplateSyntaxError\n<span class=\"kn\">from</span> <span class=\"nn\">django.template.backends.base</span> <span class=\"kn\">import</span> BaseEngine\n<span class=\"kn\">from</span> <span class=\"nn\">django.template.backends.utils</span> <span class=\"kn\">import</span> csrf_input_lazy<span class=\"p\">,</span> csrf_token_lazy\n\n<span class=\"kn\">import</span> <span class=\"nn\">foobar</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">FooBar</span><span class=\"p\">(</span>BaseEngine<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    app_dirname <span class=\"o\">=</span> <span class=\"s2\">&quot;foobar&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> params<span class=\"p\">):</span>\n        params <span class=\"o\">=</span> params<span class=\"o\">.</span>copy<span class=\"p\">()</span>\n        options <span class=\"o\">=</span> params<span class=\"o\">.</span>pop<span class=\"p\">(</span><span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>copy<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>params<span class=\"p\">)</span>\n\n        <span class=\"bp\">self</span><span class=\"o\">.</span>engine <span class=\"o\">=</span> foobar<span class=\"o\">.</span>Engine<span class=\"p\">(</span><span class=\"o\">**</span>options<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">from_string</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> template_code<span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> Template<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>engine<span class=\"o\">.</span>from_string<span class=\"p\">(</span>template_code<span class=\"p\">))</span>\n        <span class=\"k\">except</span> foobar<span class=\"o\">.</span>TemplateCompilationFailed <span class=\"k\">as</span> exc<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> TemplateSyntaxError<span class=\"p\">(</span>exc<span class=\"o\">.</span>args<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_template</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> template_name<span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> Template<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>engine<span class=\"o\">.</span>get_template<span class=\"p\">(</span>template_name<span class=\"p\">))</span>\n        <span class=\"k\">except</span> foobar<span class=\"o\">.</span>TemplateNotFound <span class=\"k\">as</span> exc<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> TemplateDoesNotExist<span class=\"p\">(</span>exc<span class=\"o\">.</span>args<span class=\"p\">,</span> backend<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"p\">)</span>\n        <span class=\"k\">except</span> foobar<span class=\"o\">.</span>TemplateCompilationFailed <span class=\"k\">as</span> exc<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> TemplateSyntaxError<span class=\"p\">(</span>exc<span class=\"o\">.</span>args<span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Template</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> template<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>template <span class=\"o\">=</span> template\n\n    <span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> request<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> context <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            context <span class=\"o\">=</span> <span class=\"p\">{}</span>\n        <span class=\"k\">if</span> request <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            context<span class=\"p\">[</span><span class=\"s2\">&quot;request&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> request\n            context<span class=\"p\">[</span><span class=\"s2\">&quot;csrf_input&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> csrf_input_lazy<span class=\"p\">(</span>request<span class=\"p\">)</span>\n            context<span class=\"p\">[</span><span class=\"s2\">&quot;csrf_token&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> csrf_token_lazy<span class=\"p\">(</span>request<span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>template<span class=\"o\">.</span>render<span class=\"p\">(</span>context<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>The postmortem appears when <a class=\"reference internal\" href=\"/id/5.0/topics/templates/#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">TemplateDoesNotExist</code></a> is\nraised. It lists the template engines and loaders that were used when trying to\nfind a given template. For example, if two Django engines are configured, the\npostmortem will appear like:</p>\n<img alt=\"/id/5.0/_images/postmortem.png\" src=\"/id/5.0/_images/postmortem.png\" />\n<p>Custom engines can populate the postmortem by passing the <code class=\"docutils literal notranslate\">backend</code> and\n<code class=\"docutils literal notranslate\">tried</code> arguments when raising <a class=\"reference internal\" href=\"/id/5.0/topics/templates/#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">TemplateDoesNotExist</code></a>.\nBackends that use the postmortem <a class=\"reference internal\" href=\"#template-origin-api\"><span class=\"std std-ref\">should specify an origin</span></a> on the template object.</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/5.0/_images/template-lines.png\" src=\"/id/5.0/_images/template-lines.png\" />\n<p>Mesin penyesuaian dapat mengumpulkan informasi ini dengan mengatur atribut <code class=\"docutils literal notranslate\">template_debug</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\">dict</code></a> dengan nilai berikut:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">'name'</code>: Nama dari cetakan dimana pengecualian muncul.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'message'</code>: Pesan pengecualian.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'source_lines'</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\">'line'</code>: Baris angka dimana pengecualian muncul.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'before'</code>: Isi pada baris kesalahan sebelum token yang memunculkan kesalahan.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'during'</code>: Token yang memunculkan kesalahan.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'after'</code>: Isi pada baris kesalahan setelah token yang memunculkan kesalahan.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'total'</code>: Jumlah baris dalam <code class=\"docutils literal notranslate\">source_lines</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'top'</code>: Baris angka dimana <code class=\"docutils literal notranslate\">source_lines</code> mulai.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'bottom'</code>: Baris angka dimana <code class=\"docutils literal notranslate\">source_lines</code> berakhir.</p></li>\n</ul>\n<p>Diberikan cetakan kesalahan diatas, <code class=\"docutils literal notranslate\">template_debug</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 memiliki obyek <a class=\"reference internal\" href=\"/id/5.0/ref/templates/api/#django.template.base.Origin\" title=\"django.template.base.Origin\"><code class=\"xref py py-class docutils literal notranslate\">Origin</code></a> tersedia melalui atribut <code class=\"docutils literal notranslate\">template.origin</code>. Ini mengadakan informasi mencari kesalahan untuk ditampilkan dalam <a class=\"reference internal\" href=\"#template-postmortem\"><span class=\"std std-ref\">template postmortem</span></a>, sama seperti pustaka pihak ke 3, seperti <a class=\"reference external\" href=\"https://github.com/jazzband/django-debug-toolbar/\">Django Debug Toolbar</a>.</p>\n<p>Mesin disesuaikan dapat menyediakan informasi <code class=\"docutils literal notranslate\">template.origin</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\">'name'</code>: Jalur penih pada cetakan.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'template_name'</code>: Jalur relatif ke cetakan ketika dilewatkan kedalam metode memuat cetakan.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'loader_name'</code>: Sebuah string pilihan mencirikan fungsi atau kelas digunakan untuk memuat cetakan misalnya <code class=\"docutils literal notranslate\">django.template.loaders.filesystem.Loader</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 \"Bagaimana\"","url":"/id/5.0/howto/"}],"prev":{"docname":"howto/custom-lookups","title":"Bagaimana menulis pencarian disesuaikan","url":"/id/5.0/howto/custom-lookups/"},"next":{"docname":"howto/custom-template-tags","title":"Bagaimana membuat cetakan etiket dan saringan disesuaikan","url":"/id/5.0/howto/custom-template-tags/"},"formats":{"html":"/id/5.0/howto/custom-template-backend/","markdown":"/id/5.0/howto/custom-template-backend.md","json":"/id/5.0/howto/custom-template-backend.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/howto/custom-template-backend.txt","official":"https://docs.djangoproject.com/id/5.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","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}