Параметры полей и моделей в Django. Редактор модели

Теперь необходимо доработать проект. Во-первых, созданная ранее модель имеет название в виде непонятной аббревиатуры Bbs, вместо логичного названия Объявления. Во-вторых, страницы редактирования и добавления новой записи в качестве надписей элементов формы имеют имена полей модели (price, title и content), что неудобно. В-третьих, нет возможности отсортировать объявления по дате публикации. Одним словом, необходимо настроить основные параметры для модели и ее полей.

Откроем для редактирования модуль models.py приложения bboard и внесем изменения в код:

class Bb(models.Model):
    title = models.CharField(max_length=50, verbose_name= 'Товар')
    content = models.TextField(null=True, blank=True,
                                          verbose_name= 'Описание')
    price = models.FloatField(null=True, blank=True, verbose_name= 'Цена')
    publiched = models.DateTimeField(auto_now_add=True, db_index=True,
				     verbose_name= 'Опубликовано')
    class Meta:
        verbose_name_plural = 'Объявления'
        verbose_name = 'Объявление'
        ordering = ['-published']

Именованный параметр verbose_name, добавленный в вызов каждого конструктора класса, позволяет добавить понятное пользователю название поля. В класс модели также добавлен вложенный класс Meta, в котором перечислены атрибуты класса с параметрами самой модели:

  • verbose_name_plural – название создаваемой модели во множественном числе;
  • verbose_name – название в единственном числе;
  • ordering – набор полей, который будет использоваться для сортировки по умолчанию.

После сохранения изменений в коде и обновления страницы можно увидеть следующие изменения:

  • в списке приложений модель теперь имеет название Объявления, вместо Bbs;
  • на странице со списком записей запись модели теперь обозначается как Объявление, ранее было Bb;
  • интерфейс панели редактирования и добавления записи содержат понятные пользователю надписи (Цена, Описание и Товар), вместо price, content и title соответственно.

Кстати, теперь можно упростить код контроллера index(), который объявлен в модуле views.py пакета приложения, убрав указание способа сортировки.

После внесенных изменений, стало удобнее работать, но некоторые неудобства остались. К примеру, на странице списка записей название позиций формируется по специальному шаблону: <имя класса> object(<ключ>), что является малоинформативным.

Данный шаблон для модели используется на административном сайте по умолчанию, однако это можно изменить – объявить для нее класс-редактор. Объявляется редактор в модуле admin.py пакета приложения. Изменим текущий код:

from django.contrib import admin
from .models import Bb
class Bbadmin(admin.ModelAdmin):
    list_display = ('title', 'content', 'price', 'published')
    list_display_links = ('title', 'content')
    search_fields = ('title', 'content', )
admin.site.register(Bb, BbAdmin)

При объявлении класса редактора он указывается как производный от класса ModelAdmin (модуль django.contrib.admin). Набор атрибутов класса и задает основные параметры представления модели. В нашем случае использовались следующие атрибуты:

  • list_display – набор полей, которые будут отображаться при выводе списка записей;
  • list_display_links – определяет набор полей, которые необходимо преобразовать в активные ссылки, ведущие на страницу редактирования записи;
  • search_fields – формирует набор полей, по которые будет доступна фильтрация.

В нашем примере в списке будут отображаться следующие поля: название, описание товара, цена и дата публикации. Два первых поля преобразуются в гиперссылки для доступа к форме редактирования. Фильтрация возможна также по этим двум полям.

Сохраним файл и обновим страницу для проверки внесенных изменений:

Кроме прочего, появилась возможность применять фильтры по полям, указанных в search_fields – достаточно воспользоваться поисковой формой в верхней части страницы.





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: