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 для владельца и пациента!