为什么赢得了save_model覆盖允许HttpResponseRedirect()?

时间:2018-02-07 17:10:47

标签: python django django-forms django-admin

我尝试添加中间确认页面,同时根据要保存的对象的变量保存条件模型。例如,如果对象状态为draft且更改将为live,则触发确认。除了任何其他状态,只需保存而无需中间确认。

我将admin.ModelAdmin添加到我的模型管理类:

class SurveyAdmin(SimpleHistoryAdmin, admin.ModelAdmin):

我试图覆盖save_model来测试条件并在需要时添加确认:

@csrf_protect_m
@transaction.atomic
def save_model(self, request, object_id=None, form_url='', extra_context=None):
    survey = Survey.objects.get(pk=object_id.id)
    def response_add(self, request, obj, post_url_continue=None):
        if request.method == 'POST' and 'confirm' in request.POST:
            # do the thing
            return HttpResponseRedirect(reverse('admin:survey_change', args=(survey.pk,)))
        else:
            context = {
                'title': _('Make live'),
                'is_popup': False,
                'opts': self.model._meta,
                'app_label': self.model._meta.app_label,
                'object': survey,
            }
            return TemplateResponse(
                request,
                'admin/survey/make_live_confirmation.html',
                context)

问题:

似乎save_model忽略了我的HttpResponseRedirect AND 我的TemplateResponse返回。

我有这个确切的过程处理admin.py中的其他方法,但它们不是覆盖,它们是自定义定义。

为什么save_model不能让我控制回报的任何想法?

1 个答案:

答案 0 :(得分:2)

标准save_model实施仅执行obj.save(),使用它的方法(_changeform_viewchangelist_view)不期望任何返回值。

如果您想更改请求/响应流,则必须使用changeform_view

查看changelist_view单个记录更新和list_editable更改列表