Cat

Django 18. Представление для главной и категорий

В этом посте изменим представление главной страницы, напишем представление страницы категории, добавим URL маршруты и зарегистрируем модель в панели администратора.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Сайт на Django proDream 05 Сентябрь 2023 Просмотров: 826

Почти закончили с моделью категорий.
Осталось изменить представление главной страницы для вывода списка категорий, а так же добавить представление для страницы категории.

 

Представление главной страницы.

Откроем файл 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 и перейдём в панель администратора.
Там должна появиться наша модель. 

 

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

Автор

    Нет комментариев

    Реклама