2025, Oct 03 01:17

Как вывести локальный JSON в шаблон Django через представление

Разбираем, как в Django считать локальный JSON, десериализовать через json.load и передать в шаблон контекстом: примеры кода view, шаблона и маршрута, советы.

Отобразить JSON в шаблоне Django несложно, если правильно настроить поток данных. Чаще всего мешает попытка использовать шаблон или скрипт на клиенте, так и не загрузив и не передав JSON из представления. Ниже — краткое руководство: как прочитать локальный файл JSON, десериализовать его на сервере через json.load и вывести значения в шаблоне Django.

Краткое описание проблемы

Файл JSON находится по пути assets/jsons/quotes.json и содержит список в ключе emp_details с полями вроде emp_name, email и job_profile. Представление главной страницы возвращает шаблон без каких‑либо данных, поэтому показывать в шаблоне попросту нечего.

Пример кода с проблемой

Функция представления, которая отрисовывает страницу, но не загружает и не передаёт JSON:

from django.shortcuts import render
def start_page(req):
    return render(req, 'homepage.html')

Фрагмент шаблона, пытающийся что‑то сделать на стороне клиента, но не получающий данных с сервера:

{% block content %}
<script type="text/javascript">
    console.log(json1_data);
</script>
<h1>Home</h1>
<p id="demo"></p>
{% endblock %}

В чём именно ошибка

Представление ни разу не загружает файл и не добавляет переменную контекста, по которой шаблон мог бы пройтись циклом. Без значения в контексте шаблон «не знает» об emp_details, и любые обращения к данным дадут пустой результат. Решение — считать и десериализовать JSON на сервере, а затем передать его в render вместе с шаблоном.

Решение: загрузить, десериализовать и передать в контекст

Считайте файл в представлении с помощью json.load и передайте полученный объект Python в контекст шаблона. После этого перебирайте emp_details в шаблоне.

Исправленное представление:

from django.shortcuts import render
import json
def main_page(req):
    with open('assets/jsons/quotes.json') as fh:
        payload = json.load(fh)
    return render(req, 'homepage.html', { 'payload': payload })

Шаблон, который выводит данные JSON:

{% block content %}
{% for row in payload.emp_details %}
<section>
<p><strong>{{ row.emp_name }}</strong></p>
<p>{{ row.email }}</p>
<p>{{ row.job_profile }}</p>
</section>
{% endfor %}
{% endblock content %}

Маршрут, направляющий корневой путь на это представление:

from django.urls import path
from . import views
urlpatterns = [
    path('', views.main_page, name='home'),
]

Почему это важно

Этот небольшой пример наглядно показывает, как устроен цикл request–view–template в Django. Данные должны приходить из представления, готовиться на сервере (в нашем случае — путём десериализации JSON) и только затем попадать в шаблон для вывода. Понимание этой схемы важно для предсказуемого серверного рендеринга и помогает избежать ситуации, когда «шаблон ничего не показывает».

Вывод и практические советы

Читайте и десериализуйте JSON внутри представления, передавайте в шаблон контекст с понятным именем и перебирайте его в разметке. Следите, чтобы путь к файлу не менялся, а шаблон обращался к реальным ключам JSON — таким как emp_details, emp_name, email и job_profile. Если данные должны выйти за рамки статического файла, подумайте о переносе их в базу данных — так будет проще выполнять запросы и обновления.

Материал основан на вопросе на StackOverflow от Theodore Ar. и ответе Uchenna Adubasim.