|
Table of contents
|
Изменения, которые мы сделали ранее — null=True, blank=True и verbose_name — являются изменениями на уровне модели, а не на уровне интерфейса администратора. То есть, эти изменения являются фундаментальной частью модели, интерфейс администратора Django просто использует их, и в них ничего специфического для административного интерфейса нет.
Помимо этого, интерфейс администратора предоставляет множество
возможностей настроить его работу для конкретной модели. Эти
настройки реализуются с помощью классов
Давайте погрузимся в настройку интерфейса, определив поля,
которые будут отображатся в списке редактирования для нашей
модели class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, verbose_name='e-mail')
def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name)
В результате список изменения обьектов
Мы можем изменить это стандартное поведение, добавив в список дополнительные поля. Было бы удобно, например, если бы на этой странице отображался адрес электронной почты автора и можно было сортировать по имени и фамилии.
Чтобы это реализовать определим класс
from django.contrib import admin
from mysite.books.models import Publisher, Author, Book
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email')
admin.site.register(Publisher)
admin.site.register(Author, AuthorAdmin)
admin.site.register(Book)
Вот, что мы сделали:
Внеся новые настройки, обновляем страницу списка редактирования авторов, и вы увидите, что на странице теперь отображается три колонки — имя, фамилия и email-адресс. К тому же, можно производить сортировку по колонкам с помощью нажатия на их заголовок. (См. рисунок «Страница списка редактирования авторов с опцией list_display»):
Теперь добавим простую панель поиска. Добавьте
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email')
search_fields = ('first_name', 'last_name')
Обновите страницу и вы увидите панель поиска
вверху. (См. рисунок «Страница списка редактирования авторов с опцией search_fields».) Мы просто указали
странице со списком редактирования, чтобы она отобразила
панель поиска, которая производит поиск по полям
Теперь добавим фильтр по дате к странице списка редактирования
модели from django.contrib import admin
from mysite.books.models import Publisher, Author, Book
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email')
search_fields = ('first_name', 'last_name')
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
admin.site.register(Publisher)
admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)
Так как мы работаем с другим набором настроек, мы создали
отдельный класс
Параметр
Ещё одним способом фильтрации по дате является использование
опции class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
К странице списка редактирования сверху добавляется развернутая панель навигации по дате, как показано на рисунке «Страница списка редактирования книг с опцией date_hierarchy». Она начинается со списка доступных годов, затем месяцев и дней.
Обратите внимание, опция
Теперь изменим сортировку по умолчанию, чтобы на странице
списка редактирования, книги сортировались по дате публикации
в направлении убывания. По умолчанию, объекты сортируются в
соответствии с атрибутом class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
Опция Обновим страницу списка редактирования. Обратите внимание, что возле заголовка поля даты публикации появилась стрелка, указывающая на направление сортировки. (См. рисунок «Страница списка редактирования книг с сортировкой».)
Мы рассмотрели основные настройки. Используя их, можно создать функциональный и удобный интерфейс администратора всего парой строк кода. Так же, как и со списками редактирования, форма редактирования может быть настроена множеством способов.
Сначала определим порядок отображения полей. По умолчанию,
поля отображаются в том же порядке, в каком они были
определены в модели. Мы можем изменить этот порядок с помощью
опции class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
fields = ('title', 'authors', 'publisher', 'publication_date')
Теперь форма редактирования для книг будет использовать указаный порядок полей. Более естественно, если название книги будет идти перед автором. Конечно, порядок полей зависит от вашего способа работы с данными. Все формы разные. Другой полезной особенностью, которую предоставляет опция fields является исключение определённых полей из списка редактирования. Просто уберите из списка поля, которые требуется исключить. Вы можете использовать это в случае, когда вашим административным пользователям позволено редактировать только определённые части данных или если часть полей изменяется с помощью внешнего автоматизированного процесса. Например, в нашей базе с книгами, мы можем спрятать поле publication_date: class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
fields = ('title', 'authors', 'publisher')
В результате, форма редактирования книг не предоставляет возможности изменения даты публикации. Это может быть полезно в случае, если вы издатель, которые предпочитает, чтобы его авторы не отодвигали даты публикаций. (Естественно, это чисто гипотетический пример.) Когда пользователь использует эту неполную форму для добавления книги, Django устанавливает publication_date в None — поэтому убедитесь, что поле имеет свойство null=True.
Другая часто используемая настройка формы редактирования
используется для полей типа многие-ко-многим. Как можно было
увидеть на форме редактирования для книг, интерфейс
администратора представляет каждое поле типа
Интерфейс администратора предоставляет решение —
filter_horizontal. Добавим его в
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
filter_horizontal = ('authors',)
(Обратите внимание, что мы удалили параметр fields.) Обновите страницу и вы заметите, что поле «Автор» теперь использует удобный javascript-интерфейс фильтрации, который позволяет искать среди элементов и перемещать выбранных авторов в поле выбранных и наоборот.
Мы настоятельно рекомендуем использовать
filter_horizontal для полей
Классы
Опции filter_horizontal и
filter_vertical работают только с полями
Методом для решения этой задачи является использование опции
raw_id_fields. Укажите для неё кортеж с именами
полей class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
filter_horizontal = ('authors',)
raw_id_fields = ('publisher',)
Что вы будете вводить в это поле? Идентификатор издателя. Учитывая то, что люди не могут запомнить идентификаторы из базы данных, рядом находится иконка с увеличительным стеклом, которую вы можете нажать для отображения окна, на котором вы можете выбрать требуемого издателя. |
Found misprint?
Select it with the mouse and hit Enter
-
Processed:
33
1
199
25
The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!
We are glad to hear your questions, comments or suggestions!
(Open in new tab)
Users number: 601
Русская группа
Ускорить процесс перевода!
ЯМ:41001223475816
|
| © 2008-2012 Ruslan Popov @ gmail.com | Powered by Django 1.2.5 |
reply to v_bratkev
Обьясните чайнику пожалуйста, как можна оставить поля 'first_name' и 'last_name' в одной колонке, а email во второй! list_display = ('first_name', 'last_name', 'email') - здесь в примере мы задаем 3 колонки!
Вопросы задавать на форуме.
Обьясните чайнику пожалуйста, как можна оставить поля 'first_name' и 'last_name' в одной колонке, а email во второй! list_display = ('first_name', 'last_name', 'email') - здесь в примере мы задаем 3 колонки!
reply to savao
Выполняя все рекомендации книги заметил 2 момента.
1. Регистронезависимый поиск работает только для латиницы. При работе с кирилицей нужно указывать только точное название.
2. При использовании последней указанной здесь опции, raw_id_fields = ('publisher',), получается что при нажатии на иконку увеличительного стекла переходишь в форму редактирования издателей, а выбрать их там не можешь. Вибирать можно только указав конкретное число в поле. А, учитывая предыдущие действия, номер издателя ты не видишь, и издатели идут не по порядку id, а упорядочены по названию, то и понять, кто из них какой номер имеет, тоже нельзя... :)
Не знаю, может чего не так делал.
все по тому же шаблону и id видно
class PublisherAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
admin.site.register(Publisher, PublisherAdmin)
reply to savao
Выполняя все рекомендации книги заметил 2 момента.
1. Регистронезависимый поиск работает только для латиницы. При работе с кирилицей нужно указывать только точное название.
2. При использовании последней указанной здесь опции, raw_id_fields = ('publisher',), получается что при нажатии на иконку увеличительного стекла переходишь в форму редактирования издателей, а выбрать их там не можешь. Вибирать можно только указав конкретное число в поле. А, учитывая предыдущие действия, номер издателя ты не видишь, и издатели идут не по порядку id, а упорядочены по названию, то и понять, кто из них какой номер имеет, тоже нельзя... :)
Не знаю, может чего не так делал.
Что то я напутал и не туда нажал. Предыдущий пост естественно для savao.
reply to tv
Наделал скриншотов, которые нужны на этой странице, но обрабатывать напильником лениво (т.е. в скриншотах полностью весь экран ;-), если они (такие скриншоты) нужны, то пишите - вышлю.
П.С. сначала написал тоже самое со страницы /feedback, но пришла ошибка - "Mail delivery failed: returning message to sender" от mailer-daemon@.
To tv:
Все там можно выбирать - нажимаешь на ссылку с именем нужного автора (как для редактирование) и его id выбирается автоматически.
Ура! Нашел решение проблемы! Как вы помните, у меня возникала ошибка при добавлении записи date_hierarchy = 'publication date'. Вот ошибка: "Caught AttributeError while rendering: 'unicode' object has no attribute 'year'."
Причина ошибки: Неверно задано свойство поля 'publication_date'. Необходимо, чтобы оно было date, а не varchar(255), как было у меня.
Чтобы задать это для MySQL выполните команду:
ALTER TABLE books_book MODIFY books_book.publication_date date NULL;
Ребята, простите за ошибку. Появление указанной ошибки произошло после добавления строчки date_hierarchy = 'publication_date'
Никак не могу понять, в чем дело...
Столкнулся с ошибкой: "Caught AttributeError while rendering: 'unicode' object has no attribute 'year'."
Вот что я сделал:
1. Согласно инструкции этой книги, в файл admin.py добавил строчку для класса BookAdmin:
last_filter = ('publication_date',)
2. Зашел в админку.
3. Нажал на категорию Books нашего приложения Books.
Может, кто-нибудь подскажет, как это исправить? :)
> 1. Регистронезависимый поиск работает только для латиницы. При работе с кирилицей нужно указывать только точное название.
Это зависит от БД. Django просто строит запрос и возврает результат. Иногда даже на странности разных БД забивают и не модифицируют результат.
Выполняя все рекомендации книги заметил 2 момента.
1. Регистронезависимый поиск работает только для латиницы. При работе с кирилицей нужно указывать только точное название.
2. При использовании последней указанной здесь опции, raw_id_fields = ('publisher',), получается что при нажатии на иконку увеличительного стекла переходишь в форму редактирования издателей, а выбрать их там не можешь. Вибирать можно только указав конкретное число в поле. А, учитывая предыдущие действия, номер издателя ты не видишь, и издатели идут не по порядку id, а упорядочены по названию, то и понять, кто из них какой номер имеет, тоже нельзя... :)
Не знаю, может чего не так делал.
Наделал скриншотов, которые нужны на этой странице, но обрабатывать напильником лениво (т.е. в скриншотах полностью весь экран ;-), если они (такие скриншоты) нужны, то пишите - вышлю.
П.С. сначала написал тоже самое со страницы /feedback, но пришла ошибка - "Mail delivery failed: returning message to sender" от mailer-daemon@.