如何在Django Admin加载的JavaScript文件中获取服务器数据
在Django Admin页面给JS注入服务器端数据
完全可以在Django Admin的HTML头部添加带动态服务器数据的script标签,下面是两种实用的实现方式:
方式一:自定义Admin模板(最常用)
- 在项目的
templates目录下新建admin/base_site.html,继承默认Admin模板:
{% extends "admin/base_site.html" %} {% block extrahead %} {{ block.super }} <script> // 把settings里的配置挂载到全局window对象 window.adminConfig = {{ ADMIN_CONFIG_JSON|safe }}; </script> {% endblock %}
- 在
settings.py里处理好要传递的变量:
import json import os # 从环境变量加载原始配置并转成Python对象 raw_admin_config = json.loads(os.environ.get('ADMIN_CONFIG', '{}')) # 转成JS能直接解析的JSON字符串 ADMIN_CONFIG_JSON = json.dumps(raw_admin_config)
这里的|safe过滤器是告诉Django不要转义JSON里的特殊字符,保证JS能正常解析。
3. 确认项目的TEMPLATES配置里,模板目录被正确识别(比如APP_DIRS设为True,或者在DIRS里添加你的templates路径),这样Admin会优先用你自定义的模板。
方式二:自定义Admin站点类(无需改模板)
如果不想动模板,可以通过自定义AdminSite来注入数据:
from django.contrib.admin import AdminSite from django.utils.html import format_html from django.conf import settings class CustomAdminSite(AdminSite): def each_context(self, request): context = super().each_context(request) # 把配置传到模板上下文 context['admin_config_json'] = settings.ADMIN_CONFIG_JSON return context def index(self, request, extra_context=None): extra_context = extra_context or {} # 生成script标签并加到页面头部 extra_context['extrahead'] = format_html( '<script>window.adminConfig = {};</script>', settings.ADMIN_CONFIG_JSON ) return super().index(request, extra_context=extra_context) # 替换默认的admin站点 admin_site = CustomAdminSite(name='custom_admin')
然后在admin.py里用这个自定义站点注册模型:
from .admin_site import admin_site admin_site.register(你的模型类)
怎么用注入的数据
之后在你的自定义JS文件里,直接拿window.adminConfig就能用了:
// 举个例子:验证输入字段 document.getElementById('id_your_field').addEventListener('input', function(e) { const allowedVals = window.adminConfig.allowed_values; if (!allowedVals.includes(e.target.value)) { e.target.setCustomValidity('这个值不在允许范围内哦'); } else { e.target.setCustomValidity(''); } });
注意点
- 别把敏感数据往前端传,因为前端是完全公开可查的。
- 用
json.dumps转数据时,确保格式正确,|safe过滤器别漏加,避免出现JS语法错误或者XSS风险(这里数据来自环境变量/settings,相对安全,但也要注意格式)。
内容的提问来源于stack exchange,提问作者Helgi Borg
相关产品推荐
相关产品推荐

