使用 Django 1.8 的 show_change_link,“保存”按钮返回错误页面
Posted
技术标签:
【中文标题】使用 Django 1.8 的 show_change_link,“保存”按钮返回错误页面【英文标题】:With Django 1.8's show_change_link, "Save" button returns to wrong page 【发布时间】:2015-11-29 19:58:12 【问题描述】:作为 Django 1.8 中的一项新功能,我们有 InlineModelAdmin.show_change_link
,用文档的话来说,
指定可以在管理员中更改的内联对象是否具有指向更改表单的链接。
这太好了,我一直在寻找要添加的这个功能。
只有一个问题。
假设我正在为某个具有内联的模型实例的管理员更改表单(例如,考虑 Poll
模型,内联 Choice
,来自 Django tutorial)。我使用新的“更改”链接转到Choice
s 之一的完整更改表单。我做了一些修改,然后点击“保存”。
我希望回到原来的位置——即Poll
实例的更改表单。相反,我被带到了所有 Choice
实例的列表中。
我如何让 Django 记住如果我来自内联列表,我应该在“保存”时返回那里? (但如果我确实直接从所有Choice
s 的列表中编辑Choice
,我应该回到那里。)
【问题讨论】:
【参考方案1】:您可以通过覆盖完整 Choice 管理员上的 response_change
方法让 Django 返回到 Poll 实例:
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
class ChoiceAdmin(admin.ModelAdmin):
'''
To be called from the Poll choice inline. It will send control back
to the Poll change form, not the Choice change list.
'''
fields = [...]
def response_change(self, request, choice):
if not '_continue' in request.POST:
return HttpResponseRedirect(reverse("admin:appname_poll_change", args=(choice.poll.id,)))
else:
return super(ChoiceAdmin, self).response_change(request, choice)
要解决您问题的第二部分:我认为您必须在模型上注册第二个未修改的管理员。您可以使用代理模型来做到这一点。见Multiple ModelAdmins/views for same model in Django admin
【讨论】:
以上是关于使用 Django 1.8 的 show_change_link,“保存”按钮返回错误页面的主要内容,如果未能解决你的问题,请参考以下文章