Как получить доступ к данным сервера в файле 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
});