# Dokumentasi Django 4.2.9.dev20231204082947

# Bagaimana menerapkan backend cetakan disesuaikan

## Backend penyesuaian

Ini adalah bagaimana menerapkan backend cetakan penyesuaian untuk menggunakan sistem cetakan lain. Sebuah backend cetakan adalah sebuah kelas yang mewarisi `django.template.backends.base.BaseEngine`. Itu harus diterapkan `get_template()` dan pilihan `from_string()`. Ini adalah sebuah contoh untuk pustaka cetakan khayal `foobar`:

    from django.template import TemplateDoesNotExist, TemplateSyntaxError
    from django.template.backends.base import BaseEngine
    from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy

    import foobar

    class FooBar(BaseEngine):
        # Name of the subdirectory containing the templates for this engine
        # inside an installed application.
        app_dirname = "foobar"

        def __init__(self, params):
            params = params.copy()
            options = params.pop("OPTIONS").copy()
            super().__init__(params)

            self.engine = foobar.Engine(**options)

        def from_string(self, template_code):
            try:
                return Template(self.engine.from_string(template_code))
            except foobar.TemplateCompilationFailed as exc:
                raise TemplateSyntaxError(exc.args)

        def get_template(self, template_name):
            try:
                return Template(self.engine.get_template(template_name))
            except foobar.TemplateNotFound as exc:
                raise TemplateDoesNotExist(exc.args, backend=self)
            except foobar.TemplateCompilationFailed as exc:
                raise TemplateSyntaxError(exc.args)

    class Template:
        def __init__(self, template):
            self.template = template

        def render(self, context=None, request=None):
            if context is None:
                context = {}
            if request is not None:
                context["request"] = request
                context["csrf_input"] = csrf_input_lazy(request)
                context["csrf_token"] = csrf_token_lazy(request)
            return self.template.render(context)

Lihat DEP 182 untuk informasi lebih.

## Penyatuan mencari kesalahan untuk mesin disesuaikan

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:

### Cetakan postmortem

The postmortem appears when `TemplateDoesNotExist` is raised. It lists the template engines and loaders that were used when trying to find a given template. For example, if two Django engines are configured, the postmortem will appear like:

Custom engines can populate the postmortem by passing the `backend` and `tried` arguments when raising `TemplateDoesNotExist`. Backends that use the postmortem should specify an origin on the template object.

### Informasi baris kontekstual

Jika sebuah kesalahan terjadi selama mengurai cetakan atau sedang membangun, Django dapat menampilkan baris dari kesalahan yang terjadi. Sebagai contoh:

Mesin penyesuaian dapat mengumpulkan informasi ini dengan mengatur atribut `template_debug` pada pengecualian dimunculkan selama mengurai dan membangun. Atribut ini adalah `dict` dengan nilai berikut:

- `'name'`: Nama dari cetakan dimana pengecualian muncul.
- `'message'`: Pesan pengecualian.
- `'source_lines'`: Baris sebelum, sesudah, dan termasuk baris pengecualian yang muncul. Ini untuk konteks, jadi itu jangan mengandung lebih dari 20 baris atau lebih.
- `'line'`: Baris angka dimana pengecualian muncul.
- `'before'`: Isi pada baris kesalahan sebelum token yang memunculkan kesalahan.
- `'during'`: Token yang memunculkan kesalahan.
- `'after'`: Isi pada baris kesalahan setelah token yang memunculkan kesalahan.
- `'total'`: Jumlah baris dalam `source_lines`.
- `'top'`: Baris angka dimana `source_lines` mulai.
- `'bottom'`: Baris angka dimana `source_lines` berakhir.

Diberikan cetakan kesalahan diatas, `template_debug` akan berupa seperti:

    {
        "name": "/path/to/template.html",
        "message": "Invalid block tag: 'syntax'",
        "source_lines": [
            (1, "some\n"),
            (2, "lines\n"),
            (3, "before\n"),
            (4, "Hello {% syntax error %} {{ world }}\n"),
            (5, "some\n"),
            (6, "lines\n"),
            (7, "after\n"),
            (8, ""),
        ],
        "line": 4,
        "before": "Hello ",
        "during": "{% syntax error %}",
        "after": " {{ world }}\n",
        "total": 9,
        "bottom": 9,
        "top": 1,
    }

### API asli dan penggabungan pihak-ketiga

Cetakan Django memiliki obyek `Origin` tersedia melalui atribut `template.origin`. Ini mengadakan informasi mencari kesalahan untuk ditampilkan dalam template postmortem, sama seperti pustaka pihak ke 3, seperti Django Debug Toolbar.

Mesin disesuaikan dapat menyediakan informasi `template.origin` milik mereka sendiri dengan membuat sebuah obyek yang menentukan atribut berikut:

- `'name'`: Jalur penih pada cetakan.
- `'template_name'`: Jalur relatif ke cetakan ketika dilewatkan kedalam metode memuat cetakan.
- `'loader_name'`: Sebuah string pilihan mencirikan fungsi atau kelas digunakan untuk memuat cetakan misalnya `django.template.loaders.filesystem.Loader`.