Django自定义管理后台列表视图
我在我的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