{"title":"Come implementare un backend per template personalizzato","version":"6.1","locale":"it","docname":"howto/custom-template-backend","url":"/it/6.1/howto/custom-template-backend/","canonical":"https://djangodocs.dev/it/6.1/howto/custom-template-backend/","summary":"Ecco come implementare un backend di template custom per utilizzare un altro sistema di template.","html":"<h1>Come implementare un backend per template personalizzato<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 personalizzati<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>Ecco come implementare un backend di template custom per utilizzare un altro sistema di template. Un backend di template è una classe che eredita da <code class=\"docutils literal notranslate\">django.template.backends.base.BaseEngine</code>. Deve implementare <code class=\"docutils literal notranslate\">get_template()</code> ed opzionalmente <code class=\"docutils literal notranslate\">from_string()</code>. Ecco un esempio di template library fittizia <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>Vedi <a class=\"reference external\" href=\"https://github.com/django/deps/blob/main/final/0182-multiple-template-engines.rst\">DEP 182</a> per maggiori informazioni.</p>\n</section>\n<section id=\"debug-integration-for-custom-engines\">\n<span id=\"template-debug-integration\"></span><h2>Integrazione per il debug di engine custom<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>La pagina di debug di Django ha hook che forniscono informazioni dettagliate quando si verifica un template error. I motori di template personalizzati possono utilizzare questi hook per aumentare le informazioni di traceback visualizzate dagli utenti. Sono disponibili i seguenti hook:</p>\n<section id=\"template-postmortem\">\n<span id=\"id1\"></span><h3>Postmortem sul template<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>il postmortem appare quando viene sollevato <a class=\"reference internal\" href=\"/it/6.1/topics/templates/#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">TemplateDoesNotExist</code></a>. Fa una lista dei motori di template e dei loader che sono stati usati quando si cercava un determinato template. Per esempio, se sono configurati due motori Django, il postmortem apparrà così:</p>\n<img alt=\"/it/6.1/_images/postmortem.png\" src=\"/it/6.1/_images/postmortem.png\" />\n<p>I motori personalizzati possono popolare il postmortem passando gli argomenti <code class=\"docutils literal notranslate\">backend</code> e <code class=\"docutils literal notranslate\">tried</code> quando sollevano <a class=\"reference internal\" href=\"/it/6.1/topics/templates/#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">TemplateDoesNotExist</code></a>.I backend che usano il postmortem <a class=\"reference internal\" href=\"#template-origin-api\"><span class=\"std std-ref\">dovrebbero specificare una origine</span></a> sull’oggetto di template.</p>\n</section>\n<section id=\"contextual-line-information\">\n<h3>Informazione su linea contestuale<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>Se viene generato un errore durante il parsing o il rendering del template, Django è in grado di mostrare la riga in cui è presente l’errore. Ad esempio:</p>\n<img alt=\"/it/6.1/_images/template-lines.png\" src=\"/it/6.1/_images/template-lines.png\" />\n<p>I motori personalizzati possono popolare questa informazione impostando un attributo <code class=\"docutils literal notranslate\">template_debug</code> sulle eccezioni sollevate durante il parsing ed il rendering. Questo attributo è un <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">dict</code></a> con i seguenti valori:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">'name'</code>: Il nome del template in cui è avvenuta l’eccezione.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'message'</code>: Il messaggio dell’eccezione</p></li>\n<li><p><code class=\"docutils literal notranslate\">'source_lines'</code>: Le righe prima, dopo e che includono la riga dove è avvenuta l’eccezione. Questo è per il contesto, quindi non dovrebbe contenere più di 20 righe o giù di lì.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'line'</code>: Il numero di riga in cui è avvenuta l’eccezione.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'before'</code>: Il contenuto della riga dell’errore prima del token che ha generato l’errore.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'during'</code>: Il token che ha generato l’errore.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'after'</code>: Il contenuto della riga dell’errore dopo il token che ha generato l’errore.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'total'</code>: Il numero di righe in <code class=\"docutils literal notranslate\">source_lines</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'top'</code>: Il numero di riga dove inizia <code class=\"docutils literal notranslate\">source_lines</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'bottom'</code>: Il numero di riga dove termina <code class=\"docutils literal notranslate\">source_lines</code>.</p></li>\n</ul>\n<p>Dato il template di errore qui sopra, <code class=\"docutils literal notranslate\">template_debug</code> sarà simile 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=\"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>Origin API ed integrazione di terze parti<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>Django templates have an <a class=\"reference internal\" href=\"/it/6.1/ref/templates/api/#django.template.base.Origin\" title=\"django.template.base.Origin\"><code class=\"xref py py-class docutils literal notranslate\">Origin</code></a> object available\nthrough the <code class=\"docutils literal notranslate\">template.origin</code> attribute. This enables debug information to be\ndisplayed in the <a class=\"reference internal\" href=\"#template-postmortem\"><span class=\"std std-ref\">template postmortem</span></a>, as well as\nin 3rd-party libraries, like the <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-debug-toolbar/\">Django Debug Toolbar</a>.</p>\n<p>I motori personalizzati possono fornire la propria informazione <code class=\"docutils literal notranslate\">template.origin</code> creando un oggetto che specifica i seguenti attributi:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">'name'</code>: il percorso completo verso il template.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'template_name'</code>: il percorso relativo verso il template così come viene passato nei metodi di caricamento del template.</p></li>\n<li><p><code class=\"docutils literal notranslate\">'loader_name'</code>: una stringa opzionale che indentifica la funzione o la classe utilizzata per caricare il template, per es. <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 personalizzati","anchor":"custom-backends","children":[]},{"title":"Integrazione per il debug di engine custom","anchor":"debug-integration-for-custom-engines","children":[{"title":"Postmortem sul template","anchor":"template-postmortem","children":[]},{"title":"Informazione su linea contestuale","anchor":"contextual-line-information","children":[]},{"title":"Origin API ed integrazione di terze parti","anchor":"origin-api-and-3rd-party-integration","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/it/6.1/howto/"}],"prev":{"docname":"howto/overriding-templates","title":"Come sovrascrivere i templates","url":"/it/6.1/howto/overriding-templates/"},"next":{"docname":"howto/custom-template-tags","title":"Come creare tag di template e filtri personalizzati","url":"/it/6.1/howto/custom-template-tags/"},"formats":{"html":"/it/6.1/howto/custom-template-backend/","markdown":"/it/6.1/howto/custom-template-backend.md","json":"/it/6.1/howto/custom-template-backend.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/howto/custom-template-backend.txt","official":"https://docs.djangoproject.com/it/6.1/howto/custom-template-backend/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}