Django自定义管理后台列表视图

1 投票
2 回答
3083 浏览
提问于 2025-04-17 17:14

我在我的Django网站上管理的一个对象在数据库中只会有一个实例。因此,我想把列表视图改成直接跳转到这个对象的“编辑”页面。

简单来说,当你访问 /admin/my_site/widgets 时,我希望能自动跳转到 /admin/my_site/widget/1。我尝试过自定义视图、自定义模板等等,但始终找不到简单的方法来实现这个功能(或者说根本没有找到任何方法)。

这就像我想做一些这样的事情(但不管用,因为我不知道怎么改列表视图):

class WidgetAdmin(admin.ModelAdmin):
    def list_view(self, request):
        widget = Widget.objects.all()[0]
        return HttpResponseRedirect('/admin/my_site/widget/%s' % widget.id)

我也尝试过改变URL以匹配列表请求,然后在那儿进行重定向,但我似乎只能用一个完全的正则表达式来匹配列表请求,比如 (r/^.*$/),这就导致我陷入了无限循环重定向。

2 个回答

1

我也遇到过类似的问题。我用了一种稍微不同的方法,使用了ModelAdmin中的changelist_view。根据你的例子,它看起来会像这样:

class MySingleEditAdmin(admin.ModelAdmin):
   def changelist_view(self, request, extra_context=None):
       object, created = self.get_my_object()
       url = reverse('admin:%s_%s_change' %(object._meta.app_label, object._meta.module_name),  args=[object.id] )
       return HttpResponseRedirect(url)


class WidgetAdminAdmin(MySingleEditAdmin):
   def get_my_object(self):
       return Widget.objects.get_or_create(pk=1, ...default_data...)
0

好的,我是这样解决这个问题的。

class WidgetAdmin(admin.ModelAdmin):
    def list_view(self, request):
        widget = Widget.objects.all()[0]
        return HttpResponseRedirect('/admin/my_site/widget/%s' % widget.id)

    def get_urls(self):
        from django.conf.urls.defaults import *
        urls = super(WidgetAdmin, self).get_urls()
        my_urls = patterns('',
                    (r'^$', admin.site.admin_view(self.list_view))
                )
        return my_urls + urls

撰写回答