Как получить доступ к данным сервера в файле javascript, который загружается страницами администратора Django

Мне нужно получить доступ к данным сервера в javascript-файле, который загружается вместе со страницей администратора. В моем случае мне нужна json-переменная, которая устанавливается в файле settings.py (в производственной версии эта json-переменная загружается из env-variable, что означает, что содержимое переменной известно при запуске, но не жестко закодировано).

Я использую javascript для проверки и заполнения некоторых полей на странице администратора - это лучший UX, чем делать это на стороне сервера.

Можно ли добавить script-тег в головной раздел html-страницы админки, который содержит данные сервера, т.е. нестатические данные?

Если я правильно понял ваш вопрос, вам нужно отправить некоторые данные в админку с сайта, и да, есть несколько способов сделать это

  • сделайте API, который обслуживает данные, и получайте их с помощью ajax из админки
  • добавить данные в контекст страницы и использовать их непосредственно в админке

В обоих случаях вам нужно будет отредактировать админку и добавить в нее js-код, так что это то, что я покажу вам здесь

< < <
class TestAdmin(admin.ModelAdmin):

      class Media:

          js = ('js/some_js_file.js',)

Второе приближение

мы расширим шаблон формы добавления и напишем js-код прямо в шаблоне

    {% extends 'admin/change_form.html' %}
    {% block extrahead %}{{ block.super }}
     # write code here
    {% endblock %}

и в админке

    class TestAdmin(admin.ModelAdmin):
        add_form_template = 'path_to_template'

примечание: вам необходимо включить шаблоны в настройках

теперь, если вам не нравится подход API, вы можете переписать административную функцию add_form и добавить нужный вам контекст

class TestAdmin(admin.ModelAdmin):
    add_form_template = 'admin/test_form_Change.html'


    def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context['some_data'] = 'value'
        return super(TestAdmin, self).changeform_view(request, object_id, extra_context=extra_context)

и вы можете использовать этот тег для добавления данных в шаблон

Ответ от Mina Atef помог мне заставить это работать. Спасибо Мина Атеф.

Вот точный код, который я использовал, на случай, если это кому-то поможет. Это работает в Django 4.1. Мне это было нужно в представлении списка, но вы также можете использовать этот подход в представлении деталей.

Добавление в класс администраторов:

class PlaceNameAdmin(admin.ModelAdmin):
    # A lof of code not shown

    class Media:
        # Adding the javascript file
        js = ('multi_line_list_edit.js',)

    def changelist_view(self, request, extra_context=None):
        extra_context = extra_context or {}
        # Adding the extra context. It comes from settings but it can be any dynamic data.
        # The REGISTER_PLACES_SETTINGS is actually not static, since it comes 
        # from env-variable that is set in production docker environment.
        extra_context['register_places_settings'] = settings.REGISTER_PLACES_SETTINGS
        return super(PlaceNameAdmin, self).changelist_view(request, extra_context)

Необходимо добавить файл с именем change_list.html в каталог templates/admin/. См. django doc для получения дополнительной информации о том, как переопределить шаблоны администратора.

{% extends "admin/change_list.html" %}

{% block extrahead %}
{{ block.super }}

{% comment %}
See docs.djangoproject.com/en/4.1/ref/templates/builtins/#json-script for doc on how to use json_script
{% endcomment %}
{{ register_places_settings|json_script:"register_places_settings" }}
{% endblock %}

Вот как данные используются в multi_line_list_edit.js. Этот файл javascript необходимо поместить в директорию static/.

$(document).ready(function() {
    
    const register_places_settings = JSON.parse(document.getElementById('register_places_settings').textContent);
    // A lof of code not shown
    
});    
Вернуться на верх