You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django自定义change_form.html中打印POST请求传递的数据

问题根源

Django Admin的changeform_view在处理完合法的POST请求后,默认会执行重定向操作(跳转到变更列表页或者继续编辑页),不会直接渲染当前的change_form模板。所以你在POST分支下给extra_context赋值的data,根本不会传递到模板层,重定向后触发的是新的GET请求,此时你的POST分支逻辑不会执行,data自然是空值。


解决方案

方案1:用session暂存数据(适配默认重定向逻辑,改动最小)

利用session跨请求传递数据,适配Admin默认的提交后重定向逻辑:

修改admin.py代码

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    extra_context = {'title': 'Cart Add'}
    extra_context['show_save_and_add_another'] = False
    # 先从session取之前存的POST数据,取完就删除避免重复消费
    if 'post_data' in request.session:
        extra_context['data'] = request.session.pop('post_data')
    if request.method == 'POST':
        data = json.loads(request.body)
        # 把POST数据存入session,重定向后即可读取
        request.session['post_data'] = data
        print(data) # 此处可成功拿到数据
    return super(CartAdmin, self).changeform_view(request, object_id, form_url, extra_context=extra_context)

修改cart_change_form.html代码

直接输出{{ data }}到JS会有转义问题,使用Django自带的json_script过滤器安全传递JSON数据:

{% extends 'admin/change_form.html' %}
{% url 'admin:app_list' app_label=opts.app_label %}
{% load i18n admin_urls static admin_modify jazzmin %}
{% get_jazzmin_settings request as jazzmin_settings %}
{% block cart_extrajs %}
<!-- 安全渲染JSON数据节点 -->
{{ data|json_script:"post-data" }}
<script type="text/javascript">
    const postData = JSON.parse(document.getElementById('post-data').textContent);
    if(postData){
        console.log('POST接收数据:', postData);
        alert("hi");
    }
</script>
{% endblock %}

方案2:禁用重定向直接返回模板(仅适用于不需要默认Admin保存逻辑的场景)

如果你的POST请求完全是自定义逻辑,不需要走Admin默认的表单校验、保存流程,可以直接返回渲染后的模板,跳过父类的重定向逻辑:

from django.template.response import TemplateResponse

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    extra_context = {'title': 'Cart Add'}
    extra_context['show_save_and_add_another'] = False
    if request.method == 'POST':
        data = json.loads(request.body)
        extra_context['data'] = data
        print(data)
        # 直接构造模板返回,不走默认重定向
        opts = self.model._meta
        context = self.admin_site.each_context(request)
        context.update(extra_context)
        return TemplateResponse(request, 'cart_change_form.html', context)
    return super(CartAdmin, self).changeform_view(request, object_id, form_url, extra_context=extra_context)

模板修改逻辑和方案1完全一致。

内容的提问来源于stack exchange,提问作者Jo Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:45:11