Создание проекта, первые модели и админ-панель
Проект для практики
Создадим проект-библиотеку, на котором отработаем модели и ORM в этом модуле:
mkdir library_project && cd library_project
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install django
django-admin startproject config .
python manage.py startapp library
Добавьте приложение в INSTALLED_APPS:
INSTALLED_APPS = [
...
"library",
]
Что такое модель
Модель — Python-класс, который описывает таблицу в базе данных. Каждый атрибут-поле — столбец, каждый объект класса — строка.
library/models.py:
from django.db import models
class Book(models.Model):
title = models.CharField("Название", max_length=200)
author = models.CharField("Автор", max_length=100)
published = models.DateField("Дата издания")
pages = models.PositiveIntegerField("Страниц", default=0)
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ["title"]
verbose_name = "книга"
verbose_name_plural = "книги"
def __str__(self):
return self.title
- Первый позиционный аргумент поля — человекочитаемое имя (
verbose_name), его покажет админка. - Поле
id(первичный ключ) Django добавит сам. __str__определяет, как объект выглядит в админке и консоли. Без него вы увидите безликоеBook object (1).class Meta— настройки модели: сортировка по умолчанию, названия.
Миграции
Модель описана, но таблицы в базе ещё нет. Миграции — файлы с инструкциями, как изменить структуру БД:
python manage.py makemigrations
Migrations for 'library':
library/migrations/0001_initial.py
+ Create model Book
Посмотреть, какой SQL будет выполнен:
python manage.py sqlmigrate library 0001
CREATE TABLE "library_book" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"title" varchar(200) NOT NULL,
...
);
Применяем:
python manage.py migrate
Каждый раз, когда вы меняете модели (добавили поле, изменили тип), повторяйте пару makemigrations → migrate. Файлы миграций храните в git — так у всех разработчиков и на сервере будет одинаковая структура базы.
Не удаляйте миграции
Файлы в migrations/ — история изменений базы. Не удаляйте и не редактируйте применённые миграции без крайней необходимости.
Админ-панель
Админка — одна из «батареек» Django: готовый интерфейс для управления данными. Создадим администратора:
python manage.py createsuperuser
Запустите сервер и откройте http://127.0.0.1:8000/admin/. Вы увидите пользователей и группы, но не книги — модель нужно зарегистрировать.
Регистрация модели
library/admin.py:
from django.contrib import admin
from .models import Book
admin.site.register(Book)
Теперь можно добавлять, редактировать и удалять книги.
Настройка отображения
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ["title", "author", "published", "pages"] # колонки в списке
list_filter = ["published", "author"] # фильтры справа
search_fields = ["title", "author"] # строка поиска
list_editable = ["pages"] # редактировать прямо в списке
date_hierarchy = "published" # навигация по датам
ordering = ["-published"]
Декоратор @admin.register(Book) — то же самое, что admin.site.register(Book, BookAdmin).
Например, админка этого учебного сайта позволяет редактировать курсы, уроки и задания — с вложенными формами (inlines), о которых поговорим в проекте «Блог».
Итог
- Модель — класс-наследник
models.Model, поля — столбцы таблицы. makemigrationsсоздаёт миграции,migrateприменяет их.createsuperuser— администратор,admin.py— регистрация моделей.ModelAdminнастраивает список:list_display,list_filter,search_fields.
Практика решено 0 из 6
Опишите модель Book с полями: title — строка до 200 символов,
author — строка до 100 символов, published — дата (DateField).
Добавьте метод __str__, возвращающий название.
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
published = models.DateField()
def __str__(self):
return self.title
Вы добавили новую модель. Расставьте действия в правильном порядке.
-
python manage.py makemigrations -
Открыть
/admin/и добавить первую запись -
python manage.py migrate -
Описать модель в
models.py -
Зарегистрировать модель в
admin.py
Чем отличаются makemigrations и migrate?
Зарегистрируйте модель Book в админке с помощью декоратора и настройте класс BookAdmin:
в списке показывать поля title, author, published, добавить поиск по title.
from django.contrib import admin
from .models import Book
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ["title", "author", "published"]
search_fields = ["title"]
Какой командой создаётся пользователь с доступом в админку?
Как Django назовёт таблицу для модели Book из приложения library?
Войдите, чтобы отмечать пройденные уроки.