2013-02-26 168 views
0

我在我的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

你可以看看:https://github.com/tttallis/django-singletons – Brandon 2013-02-26 21:48:22

回答

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 
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...)