管理员中的 Django 自定义列表视图

Posted

技术标签:

【中文标题】管理员中的 Django 自定义列表视图【英文标题】:Django custom list view in admin 【发布时间】:2013-02-26 21:20:34 【问题描述】:

我在 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/^.*$ /) 这意味着我只是得到一个无限循环重定向。

【问题讨论】:

你可以看看:github.com/tttallis/django-singletons 【参考方案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...)

【讨论】:

【参考方案2】:

好的,我就是这样整理出来的。

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

【讨论】:

以上是关于管理员中的 Django 自定义列表视图的主要内容,如果未能解决你的问题,请参考以下文章

按 django admin 中的自定义列表显示字段进行列表过滤

在 django 中测试自定义管理操作

在管理界面上向 Django 内联对象添加自定义操作

自定义 django 管理视图

Django 管理员,自定义视图错误:int() 以 10 为底的无效文字

python DJANGO - 管理员自定义列表过滤器