Django Admin自定义表单报错“need more than 1 value to unpack”求助
解决Django Admin自定义操作按钮的"need more than 1 value to unpack"错误&form_action返回值说明
首先,这个错误几乎可以肯定是你的form_action方法返回的内容不符合调用它的代码预期——大概率是调用方尝试把返回值解包成两个变量(比如response, context = form_action(...)),但你要么没返回任何内容(默认返回None),要么只返回了单个对象,导致解包失败。
针对你的场景,结合Django Admin自定义操作的逻辑,form_action方法的返回值有两种常见的合法形式:
1. 直接返回HttpResponse对象(最常用)
如果只是完成业务逻辑后跳回Admin列表页或详情页,直接返回HttpResponseRedirect(重定向)或者HttpResponse即可。比如你的拒绝逻辑完成后,跳回Request模型的Admin列表:
from django.http import HttpResponseRedirect from django.urls import reverse class DenyForm(ApproveOrDenyForm): def form_action(self, request, admin_approver ): print "forms DenyForm Called." # 你的业务处理:更新Request模型状态为拒绝 request.status = 'denied' request.approver = admin_approver request.save() # 重定向到Request的Admin列表页(记得替换成你的app_label和模型名) return HttpResponseRedirect(reverse('admin:your_app_request_changelist'))
2. 返回元组(响应对象 + 上下文字典)
如果需要在操作后展示自定义页面,并传递额外的上下文数据(比如成功提示、请求详情),可以返回一个包含两个元素的元组:第一个是HttpResponse对象,第二个是上下文字典。这种情况通常是调用方的逻辑需要接收上下文来渲染页面:
from django.shortcuts import render class DenyForm(ApproveOrDenyForm): def form_action(self, request, admin_approver ): print "forms DenyForm Called." # 业务逻辑处理 request.status = 'denied' request.approver = admin_approver request.save() # 准备上下文数据 context = { 'request_obj': request, 'success_msg': '该请求已成功拒绝' } # 返回响应和上下文元组 return render(request, 'admin/custom_deny_success.html', context), context
额外排查点
除了返回值,你还要确认:
- 你的
form_action方法参数定义(request, admin_approver)和调用方传递的参数数量完全匹配,不要多传或少传; - 这里的
request是你自定义的Request模型实例,不是Django的HttpRequest,所以在使用render或redirect时,如果你需要用到Django的请求对象,得确保调用方有把它传递进来(不过看你的代码片段,当前方法里的request是业务模型,所以重定向时用reverse生成URL就没问题)。
内容的提问来源于stack exchange,提问作者Red Cricket
相关产品推荐
相关产品推荐

