Почти закончили с моделью категорий.
Осталось изменить представление главной страницы для вывода списка категорий, а так же добавить представление для страницы категории.
Представление главной страницы.
Откроем файл views.py.
В данный момент наше представление index просто вывод заглушки. Оно ничего не передаёт в шаблон. Давайте это изменим.
В функции index, сделаем несколько отступов перед возвратом рендера. Там напишем переменную categories_list, в которой будем обращаться к нашей модели CategoryModel и получать все объекты через менеджера:
categories_list = models.CategoryModel.objects.all()
Чуть ниже создадим переменную context, это словарь, где ключом является имя переменной, к которой мы сможем обращаться внутри шаблона, а значением будут передаваемые данные.
context = {
'categories_list': categories_list,
}
Поскольку у нас теперь не base.html выполняет функцию главной страницы, а index.html, ниже в строке с возвратом рендера изменим название файла и пропишем третьим параметром передачу в него контекста.
return render(request,
'blog/index.html',
context)
Полный код:
def index(request):
categories_list = models.CategoryModel.objects.all()
context = {
'categories_list': categories_list,
}
return render(request,
'blog/index.html',
context)
Представление страницы категории.
Напишем новую функцию category_page, принимающую в себя request, pk и slug.
В шаблон необходимо передать информацию о текущей категории, для этого, создаём переменную category и, как и в предыдущей функции, получаем из модели данные. Только нам необходимы не все объекты, а конкретный.
category = models.CategoryModel.objects.get(pk=pk)
По аналогии создаём контекст и возврат рендера:
context = {
'category': category,
}
return render(request,
'blog/category_page.html',
context)
Полный код:
def category_page(request, pk, slug):
category = models.CategoryModel.objects.get(pk=pk)
context = {
'category': category,
}
return render(request,
'blog/category_page.html',
context)
URL-паттерны.
Теперь добавим URL-паттерн для страницы категорий. Откроем файл urls.py в директории приложения и в список urlpatterns сайта, добавим следующую строку:
path('category/<int:pk>-<str:slug>/', views.category_page, name='category_page'),
Первым параметром мы формируем паттерн, состоящий из слова category, pk категории и его slug-поля.
Регистрация модели.
Осталось зарегистрировать модель в панель администратора. Откроем admin.py и зарегистрируем:
from mptt.admin import DraggableMPTTAdmin
@admin.register(models.CategoryModel)
class CategoryAdmin(DraggableMPTTAdmin):
list_display = ('tree_actions', 'indented_title', 'parent',)
list_display_links = ('indented_title',)
prepopulated_fields = {'slug': ('title',)}
search_fields = ['title', ]
Как можно заметить, мы наследуем наш класс не от ModelAdmin, а от DraggableMPTTAdmin, данный класс позволяет организовать удобное отображение дерева категорий.
В кортеже list_display появились два не указанных в модели поля:
tree_actions- добавляет в интерфейс функции взаимодействия с объектами.indented_title- поле заголовка с отступом.
В переменной prepopulated_fields мы прописываем, что поле slug будет заполняться автоматически на основе данных из поля title.
Применим миграции:
python manage.py makemigrations
python manage.py migrate
Запустим Django и перейдём в панель администратора.
Там должна появиться наша модель.


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

Комментарии
Оставить комментарийВойдите, чтобы оставить комментарий.
Комментариев пока нет.