Как предоставить данные для реакции с помощью drf без дополнительных запросов?

Я создаю одностраничное приложение с react и django rest framework. Я хочу иметь возможность изменять "статическую" информацию через интерфейс администратора django, чтобы избежать ненужного дополнительного развертывания каждый раз. Такая информация, как фоновое изображение и текст из раздела about.

Для его редактирования я создаю cms django app и регистрирую модели в admin.

Для обслуживания фронтенда в продакшене я использую TemplateView из пакета django.views.generic. Он обслуживает html файл из каталога react app. вот часть корневого urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    # ...
    # api endpoints here
    # ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += [re_path(r'^.*', TemplateView.as_view(template_name='index.html'))]

для его обслуживания в разработке я использую react-scripts start из create-react-app

Как я могу передать туда такую информацию, как текущий url фонового изображения, текст для раздела about и т.д.?

Простой вариант - создать кучу представлений для получения этой информации и запросить все данные из react app, но мне не очень нравится такой подход.

Другой вариант - переопределить TemplateView следующим образом

from django.views import generic


class TemplateView(generic.TemplateView):
    template_name = 'index.html'

    def get_context_data(self, **kwargs):
        context_data = dict()
        # get all data from db here
        return context_data

Но как тогда мне использовать это в приложении react? В производстве и в разработке.

Я считаю, что должен быть правильный способ решения такой проблемы.

Одно из возможных решений, которое я нашел, это жестко закодировать url фонового изображения на фронтенде и создать или обновить симлинк, соответствующий этому url. Таким образом, когда я загружаю новое изображение в админке django, за сценой сохраняется запись в базе данных, сохраняется сам файл и обновляется симлинк. Таким образом, я также могу установить другое изображение как активное, просто обновляя симлинк в процессе сохранения. Это решение выглядит хорошо для меня, но работает только для статических файлов, а не для текстовых данных.

Вернуться на верх