Нам нужно что-то, что будет хранить все записи нашего блога. Но прежде, давай поговорим о вещах, называемых объектами
.
В программировании существует особая концепция, она называется -- объектно-ориентированным программированием
. Идея заключается в том, что вместо скучной последовательности инструкций мы моделируем вещи и описываем как они взаимодействуют друг с другом.
Так что же такое объект? Это совокупность поведения и свойств. Звучит странно, но мы приведем пример.
Если мы хотим смоделировать кошку, то создадим объект Cat
, который обладает определенными свойства, например color
(цвет), age
(возраст), mood
(настроение: плохое, хорошее, сонное ;)), owner
(хозяин, например другой объект -- Person
или, если кошка дикая, это свойство будет пустым).
Объект Cat
будет иметь набор определенных действий: purr
(мурчать), scratch
(царапаться) или feed
(кормить, где мы дадим кошке немного CatFood
(кошачьей еды), которая так же может быть отдельным объектом со своими свойствами, например taste
(вкусом)).
Cat
--------
color
age
mood
owner
purr()
scratch()
feed(cat_food)
CatFood
--------
taste
Основная идея, таким образом, заключается в описании объекта в коде, используя его параметры (свойства объекта
) и доступные ему действия (методы
).
Так как же мы смоделируем запись в блоге? Нам же нужен блог, верно?
Для начала стоит ответить на вопрос: что такое запись в блоге? Какие свойства она имеет?
Ну, запись содержит какой-то текст и заголовок, это наверняка, верно? Было бы неплохо также знать кто её написал -- так что нам нужен автор. Ну и в заключении, нам нужно знать когда запись создана и когда опубликована.
Post
--------
title
text
author
created_date
published_date
Какие вещи можно сделать с записью в блоге? Было бы неплохо иметь метод
для её публикации, согласна?
Так что нам пригодится метод publish
.
Ну и раз уж мы определились с тем, что хотим получить, давай начнем моделирование в Django!
Зная, что представляет из себя объект, мы можем создать Django модель для записи в блоге.
Модель в Django это объект определенного свойства - он хранится в базе данных
. База данных представляет собой совокупность различных данных. Это то место, где ты будешь хранить информацию о своих пользователях, записях в блоге и т.д. Мы будем использовать базу данных SQLite для хранения информации. Это стандартная база данных в Django -- её вполне хватит для наших нужд сейчас.
Ты можешь представить модель в базе данных как электронную таблицу с колонками (полями) и строками (данными).
Для аккуратности мы создадим отдельное приложение в нашем проекте. Очень удобно иметь хорошо организованное рабочее место с самого начала. Для создания приложения нам понадобиться набрать следующую инструкцию в командной строке (из директории djangogirls
, где находится файл manage.py
):
(myvenv) ~/djangogirls$ python manage.py startapp blog
Обрати внимание, что в нашем проекте появилась новая папка blog
, которая содержит некоторые файлы. Структура нашего проекта, таким образом, будет выглядеть так:
djangogirls
├── mysite
| __init__.py
| settings.py
| urls.py
| wsgi.py
├── manage.py
└── blog
├── migrations
| __init__.py
├── __init__.py
├── admin.py
├── models.py
├── tests.py
└── views.py
После того как приложение создано, нам нужно сообщить Django, что теперь он должен его использовать. Мы сделаем это через файл mysite/settings.py
. Нам нужно найти INSTALLED_APPS
и добавить к списку 'blog',
прямо перед )
. Конечный результат должен выглядеть следующим образом:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
В файле blog/models.py
мы определяем все Модели
- модель записи для блога также пойдет сюда.
Открой файл blog/models.py
, удали весь текст и вставь на его место следующий код:
from django.db import models
from django.utils import timezone
class Post(models.Model):
author = models.ForeignKey('auth.User')
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(
default=timezone.now)
published_date = models.DateTimeField(
blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
Убедись, что использовала два символа нижнего подчеркивания (
_
) с обоих сторон от методаstr
. Это соглашение часто используется при программировании на Python, и иногда его называют "dunder" (сокращение от англ. "double-underscore").
Смотрится страшно, да? Но не волнуйся, мы объясним что значит каждая строка кода!
Строки, начинающиеся с from
или import
, открывают доступ к коду из других файлов. Так что, вместо того, чтобы копировать и вставлять один и тот же код во все файлы, мы можешь сослаться на него при помощи from ... import ...
.
class Post(models.Model):
-- эта строка определяет нашу модель (объект
).
class
это специальное ключевое слово для определения объектов.Post
это имя нашей модели, мы можем поменять его при желании (специальные знаки и пробелы использовать нельзя). Всегда начинай имена классов с прописной буквы.models.Model
означает что объект Post является моделью Django, так Django поймет, что он должен сохранить его в базу данных.Дальше мы задаем свойства, о которых уже говорили: title
, text
, created_date
, published_date
и author
. Чтобы это сделать нам нужно определиться с типом полей (это текст? число? дата? ссылка на другой объект? например, на пользователя?).
models.CharField
-- так мы определяем текстовое поле с ограничением на количество символов.models.TextField
- так определяется поле для неограниченно длинного текста. Выглядит подходящим для содержимого поста, верно?models.DateTimeField
-- дата и время.models.ForeignKey
-- ссылка на другую модель.Мы не будем объяснять каждую запятую, поскольку на это уйдет слишком много времени. Ознакомься с официальной документаций Django — если хочешь узнать больше о полях моделей и о том как определять разные объекты, то эта ссылка может помочь: (https://docs.djangoproject.com/en/1.8/ref/models/fields/#field-types).
Что насчет def publish(self):
? Это как раз метод публикации
для записи, о котором мы говорили. def
означает, что создаётся функция/метод, а publish
— это название этого метода. Можно изменить имя метода, если хочешь. Существует правило для имён функций: нужно использовать строчные буквы, а пробелы заменять на подчёркивания. Например метод, вычисляющий среднюю цену может называться calculate_average_price
.
Методы часто возвращают
что-то. Например, метод __str__
. В наше случае, после вызова метода __str__()
мы получим текст (строку) с заголовком записи.
Если тема моделей тебе до сих пор непонятна -- не стесняйся обратиться к тренеру! Мы знаем, что она действительно сложна, особенно когда ты изучаешь параллельно объекты и функции. Но мы надеемся, что все это кажется тебе теперь не магией!
Последним шагом будет добавление нашей модели в базу данных. Сначала мы должны дать Django знать, что сделали изменения в нашей модели (мы её только что создали!). Набери python manage.py makemigrations blog
. Должно получиться примерно так:
(myvenv) ~/djangogirls$ python manage.py makemigrations blog
Migrations for 'blog':
0001_initial.py:
- Create model Post
Django создал для нас файл с миграцией для базы данных. Набери python manage.py migrate blog
, результат должен быть следующим:
(myvenv) ~/djangogirls$ python manage.py migrate blog
Operations to perform:
Apply all migrations: blog
Running migrations:
Rendering model states... DONE
Applying blog.0001_initial... OK
Ура! Модель записи для блога теперь в базе данных, было бы неплохо посмотреть на неё, верно? Тогда переходи к следующей главе!