2013-02-26 6 views
0

Один из объектов, которыми я управляю на моем сайте django, будет иметь только один экземпляр в базе данных. Поэтому я хочу изменить вид списка, чтобы просто перенаправить на страницу редактирования для этого первого объекта.Django custom list view in admin

Итак, в основном, когда вы нажимаете/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

ответ

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

Мне нужно то же самое. Я решил это несколько иначе, используя changelist_view от ModelAdmin. Используя ваш пример, он выглядит примерно так:

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