Django admin - 添加自定义 link 以更改列表视图

Django admin - add custom link to change list view

首先感谢您花时间阅读我的问题
我试图在我的管理员更改列表视图中添加一个自定义按钮,但它总是给我 找不到页面 (404)

这是我的模型管理员代码:

class MyModelAdmin(admin.ModelAdmin):

    class Media:

        js = ('admin/js/additional_js.js',)

    model = MyModel

    def get_urls(self):
        urls = super(MyModelAdmin, self).get_urls()
        analyze_url = patterns('',
                           (r'^(?P<pk>\d+)/analyze/$', 
                        self.admin_site.admin_view(self.analyze_view))
                           )
        return analyze_url + urls

    def analyze_view(self, request, pk):
        # some code here
        HttpResponseRedirect(
            reverse('admin:myapp_MyModel_change', args=(pk,))
        )

我的 jQuery 添加自定义 link 以更改列表视图的代码:

(function($) {
    $(document).ready(function($) {
        $(".object-tools").append('<li><a href="analyze/" class="link">Analyze</a></li>');
    });
})(django.jQuery);

当我点击我的自定义 link 时,它给了我这个:

主键为“3/change/analyze”的 MyModel 对象不存在。

我看到 link 没有指向视图
有人可以帮我解决这个问题。
谢谢

在 Django 1.9 中,管理员更改 url 已更改为 /admin/<app>/<model>/<pk>/change/ (release notes)。

因此,在您的html中link到href="analyze/"没有意义。相对 url 被视为 /admin/<app>/<model>/3/change/analyze,而不是您期望的 /admin/<app>/<model>/3/analyze

您可能可以通过将 link 更改为:

来解决问题
<a href="../analyze/" ...

理想情况下,倒转 url 而不是相对 link 会更好。我认为这会使代码不那么脆弱。

由于您使用的是 Django 1.9,您可以更新代码以使用列表而不是 patterns:

from django.conf.urls import url

analyze_url = [
    url(r'^(?P<pk>\d+)/analyze/$', self.admin_site.admin_view(self.analyze_view)),
]