使用 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)。我使用新的“更改”链接转到Choices 之一的完整更改表单。我做了一些修改,然后点击“保存”。

我希望回到原来的位置——即Poll 实例的更改表单。相反,我被带到了所有 Choice 实例的列表中。

我如何让 Django 记住如果我来自内联列表,我应该在“保存”时返回那里? (但如果我确实直接从所有Choices 的列表中编辑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,“保存”按钮返回错误页面的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.8 使用 gmail SMTP 发送邮件

django 1.8 测试模型和迁移

我无法从 Django 1.8 升级到 2.0

DJango 1.8 在子模板上使用完全不同的 CSS

Django 1.8 - 中间多对多关系 - 使用“ManytoManyField”的结果是啥?

Django 1.8 和鼻子:冲突的模型?