123

123

123

Представления на основе классов

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


Django предоставляет нам базовые представления, которые наследуются от представления класса. Некоторые из этих существующих функций общих представлений включают встроенную логику и предоставляют утилиты - что еще лучше, мы можем комбинировать эти общие функции с нашим собственным написанным кодом!


Рассмотрим приложение, которое ведет учет учеников в классе. Мы будем использовать модель Student, которая содержит следующие поля:


# models.py

 

class Student(models.Model):

 first_name = models.CharField(max_length=30)

 фамилия_имя = models.CharField(max_length=30)

 оценка = models.CharField(max_length=30)

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


Если мы хотим использовать некоторые из этих общих представлений, мы должны сначала импортировать их из django.views.generic в верхней части нашего файла, вместе с нашей моделью Student:


# views.py

 

from .models import Student

from django.views.generic import ListView

После импорта мы можем указать, для какой модели мы будем использовать ListView:


# views.py

 

class StudentList(ListView):

 model = Student

 template_name = "schoolapp/student.html"

Обратите внимание, как мы изменили представление с функции на класс - мы даже предоставили свойства! Эти свойства позволяют нам изменять наш класс представления, чтобы включить в него другую информацию. После указания используемой модели Django автоматически попытается найти шаблон в <the_app_name>/<chosen_model_name>.html. В качестве альтернативы, мы можем явно указать представлению, какой шаблон использовать, добавив атрибут template_name к представлению, а также указав модель с помощью атрибута model. В данном случае мы указали модель как Student и явно задали template_name как шаблон "schoolapp/student.html".


Теперь давайте реализуем ListView для владельца и пациента!

Report Page