如何在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
相关产品推荐
相关产品推荐

