Django 18. Представление для главной и категорий
В этом посте изменим представление главной страницы, напишем представление страницы категории, добавим URL маршруты и зарегистрируем модель в панели администратора.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 234064
Реклама
Почти закончили с моделью категорий.
Осталось изменить представление главной страницы для вывода списка категорий, а так же добавить представление для страницы категории.
Представление главной страницы.
Откроем файл 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 и перейдём в панель администратора.
Там должна появиться наша модель.
Сделайте несколько тестовых категорий разной вложенности, затем посмотрите как оно будет выглядеть на сайте.
Все статьи