Администратор Django: Каков наилучший способ добавить пользовательский вид списка? - PullRequest
2 голосов
/ 26 декабря 2010

Я хочу предоставить пользовательское представление, очень похожее на changelist_view(), но без ссылок на представление формы редактирования. Пользователи смогут выбирать элементы в списке и применять действия так же, как в форме списка изменений, но у них не будет доступа к форме редактирования.

Я думаю, что структура в классе ModelAdmin должна быть такой:

class ProductAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(ProductAdmin, self).get_urls()
        urls += patterns('',
            (r'^selectlist/$', self.selectlist_view)
        )
        return urls

    def selectlist_view(self):
        return render_to_response(...)

Возвращаемое представление очень похоже на ModelAdmin.changelist_view(). Какой самый лучший и СУХОЙ способ сделать это?

Ответы [ 2 ]

3 голосов
/ 27 декабря 2010

Я не знаю, почему, но лично я склонен переопределять (или расширять) шаблон списка изменений для конкретной модели вместо установки обезьяны ModelAdmin.

РЕДАКТИРОВАНИЕ:

спасибо, но мне нужна настройка, которую нельзя сделать, просто переопределив шаблон.например, отображение другого набора запросов и т. д.

Чтобы отобразить другой набор запросов, вы можете переопределить ModelAdmin.queryset ().

также не должно быть в состоянииредактировать элементы в списке.если я переопределю шаблон, пользователь не увидит ссылку на форму редактирования, но он все равно сможет получить доступ к форме и отредактировать ее, введя URL-адрес, если он сможет угадать URL-адрес формы, что будет дырой в безопасности.

Почему бы просто не удалить разрешение на редактирование у рассматриваемых пользователей?Вы также можете переопределить представления «добавить» и «изменить»:

class SomeModelAdmin(admin.ModelAdmin):
    ...
    def change_view(self, request, object_id, extra_context=None):
        return render_to_response('forbiden_operation.html', dict(op='edit'))
    def ModelAdmin.add_view(self, request, form_url='', extra_context=None):
        return render_to_response('forbiden_operation.html', dict(op='add'))

Это «официальные» хуки, которые с меньшей вероятностью сломаются в будущем.

Также помните «Дзен администратора»:

По своей сути, интерфейс администратора Django предназначен для одного действия:

Редактирование доверенных пользователейструктурированный контент.

Да, это чрезвычайно просто - но эта простота основана на целом ряде предположений.Вся философия интерфейса администратора Django вытекает непосредственно из этих предположений, поэтому давайте углубимся в подтекст этой фразы в следующих разделах.«Доверенные пользователи…»

Интерфейс администратора предназначен для использования людьми, которым вы, разработчик, доверяете.Это не просто означает «люди, которые были аутентифицированы»;это означает, что Django предполагает, что вашим редакторам контента можно доверять, чтобы они поступали правильно.

Это, в свою очередь, означает, что не существует процесса утверждения для редактирования контента - если вы доверяете своим пользователям, никто не должен одобрять их изменения,Еще одним следствием является то, что система разрешений, хотя и мощная, не поддерживает ограничение доступа для каждого объекта на момент написания этой статьи.Если вы доверяете кому-то редактировать свои собственные истории, вы доверяете этому пользователю не редактировать чужие истории без разрешения.

«… редактирование…»

ПервичнаяЦель интерфейса администратора Django - позволить людям редактировать данные.Поначалу это кажется очевидным, но, опять же, оно имеет некоторые тонкие и мощные последствия.

Например, хотя интерфейс администратора весьма полезен для просмотра данных (как только что описано), он не предназначен для этой цели.Например, обратите внимание на отсутствие разрешения «просматривать» (см. Главу 12).Джанго предполагает, что если людям разрешено просматривать контент в интерфейсе администратора, им также разрешено редактировать его.

Еще одна важная вещь, на которую следует обратить внимание, - это отсутствие чего-либо, даже удаленно приближающегося к «рабочему процессу».данная задача требует ряда шагов, нет поддержки для принудительного выполнения этих шагов в любом конкретном порядке.Интерфейс администратора Django фокусируется на редактировании, а не на действиях, связанных с редактированием.Такое избегание рабочего процесса также проистекает из принципа доверия: философия интерфейса администратора заключается в том, что рабочий процесс - это проблема персонала, а не то, что должно быть реализовано в коде.

Наконец, обратите внимание на отсутствие агрегирования в интерфейсе администратора.То есть не поддерживается отображение итогов, средних значений и т. Д.Опять же, интерфейс администратора предназначен для редактирования - ожидается, что вы напишете пользовательские представления для всех остальных.

«… структурированный контент»

Как и для остальныхDjango, интерфейс администратора хочет, чтобы вы работали со структурированными данными.Таким образом, он поддерживает только редактирование данных, хранящихся в моделях Django;для чего-либо еще, например данных, хранящихся в файловой системе, вам понадобятся пользовательские представления.

Полный останов

Теперь уже должно быть ясно, что интерфейс администратора Django делаетнестараться быть всем для всех; вместо этого мы решили сосредоточиться на чем-то одном и делать это очень хорошо.

Когда речь заходит о расширении интерфейса администратора Django, большая часть той же философии верна (обратите внимание, что «расширяемость» нигде не отражается в наших целях). Поскольку пользовательские представления Django могут делать все что угодно, и поскольку они могут быть легко визуально интегрированы в интерфейс администратора (как описано в следующем разделе), встроенные возможности для настройки интерфейса администратора несколько ограничены по дизайну.

Вы должны иметь в виду, что интерфейс администратора является «просто приложением», хотя и очень сложным. Он не делает ничего, что любой разработчик Django с достаточным временем не мог бы воспроизвести. Вполне возможно, что в будущем кто-то разработает другой интерфейс администратора, основанный на другом наборе предположений и, следовательно, будет вести себя по-другому.

Наконец, мы должны отметить, что на момент написания этой статьи разработчики Django работали над новой версией интерфейса администратора, которая обеспечивает гораздо большую гибкость в настройке. К тому времени, как вы прочтете это, эти новые функции могут появиться в добросовестном дистрибутиве Django. Чтобы узнать, спросите кого-нибудь из сообщества Django, интегрирована ли ветка «newforms-admin».

Приложение администратора было значительно улучшено, чтобы обеспечить большую гибкость в настройке, но IMHO большая часть "Zen of Admin" все еще остается верной.

3 голосов
/ 26 декабря 2010

Следующий пользовательский ModelAdmin - лучшее решение, которое я мог придумать:

class UserModelAdmin(ModelAdmin):
    def get_urls(self):
        urls = super(UserModelAdmin, self).get_urls()
        info = self.model._meta.app_label, self.model._meta.module_name
        select_list_url = patterns('',
            url(r'^selectlist/$', self.selectlist_view, 
                name='%s_%s_select' % info)
        )
        return select_list_url + urls

    def selectlist_view(self, request, extra_context=None):
        temp_list_display_links = self.list_display_links
        self.list_display_links = (None, )
        response = self.changelist_view(request, extra_context)
        self.list_display_links = temp_list_display_links
        return response
...