Простое приложение на Django.Instablog.Часть 2
Создаем приложение blog простой командой :
python manage.py startapp blog Теперь посмотрим структуру файлов нашего проекта
instablog
├── blog
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── db.sqlite3
├── instablog
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
Мы создали наше приложение , но не включили в наш проект. Чтобы это сделать мы должны добавить название нашего приложения в список INSTALLED_APPS.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
Перейдем файл blog/models.py и создадим модель Photo.
from django.db import models
from django.utils import timezone
class Photo(models.Model):
title = models.CharField(max_length=150)
file = models.ImageField(upload_to='photos/')
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
Наш модель Photo состоит из следующих полей:
title - название нашей фотографии. Это строковое поле и поэтому мы используем поле CharField. Обязательно нужно задавать максимальное значение max_length. Мы указали значение 150. Поле обязательное к заполнению. Если мы хотим , чтобы поле было пустым , то мы должны добавить blank=True
file - Загружаемая фотография.Для фотографии мы используем ImageField, который наследуется от поля FileField и который проверяет является ли загруженный файл изображением. Этому полю мы должны указать путь , куда мы будем загружать наши файлы. Мы указали для него папку photos. А вот эта папка у нас будет расположена в каталоге, в который указывает настройка MEDIA_ROOT.
Поэтому мы должны добавить настройку MEDIA_ROOT в файл instablog/settings.py . Добавим еще MEDIA_URL
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
И добавим каталог media в корень нашего проекта. created_at - время создания нашей записи. Так как мы будем тут хранить время, то мы должны использовать поле DatetimeField. По умолчанию мы указали время создания.
Наше приложение blog содержит модель Photo и поэтому мы можем создать миграции
Но если мы попытаемся создать миграции , то Django не даст это сделать, так как поле ImageField требует библиотеку Pillow С помощью pip устанавливаем эту библиотеку. Но это нелегкая задача, так как у меня на ubuntu я не мог его сразу установить
pip3 install pillow
После того как мы установили пакет pillow мы можем убедиться в этом выполнив команду
pip freeze
Так как мы далее с помощью pip будем устанавливать зависимости и когда мы будем переносить проект на продакшн . нам необходимо будет также установить все зависимости. Поэтому , чтобы хранить все наши зависимости в одном файле мы создадим в корне проекта создадим файл requirements.txt и туда поместим наши зависимости, которые мы вывели с помощью команды pip freeze
Теперь обратно попробуем создать миграции для приложения blog python manage.py makemigrations
Вуаля и миграции у нас создались. Вы можете убедиться в этом зайдя в каталог blog/migrations/
У нас создался файл 0001_initial.py Теперь мы должны применить эти миграции
python manage.py migrate
Здесь мы импортируем нашу модель Photo из файла(модуля) models.py и эту модель регистрируем в нашей админке. Зайдите обратно в админку и вы теперь можете увидеть , что добавилось наше приложение blog , но самое название приложения и название файла модели на английском. Чтобы надпись Photo была на русском мы должны перейти в класс blog/models.py и для модели Photo добавить class Meta с полями verbose_name и verbose_name_plural
class Photo(models.Model):
title = models.CharField(max_length=150)
file = models.ImageField(upload_to='photos/')
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
class Meta:
verbose_name = 'Фотография'
verbose_name_plural = 'Фотографии'
И ни слова о других языках(про интернационализацию приложений в следующей жизни)
А чтобы название приложения было на русском , то нам необходимо в файле blog/apps.py добавить verbose_name = 'Блог'
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
verbose_name = 'Блог'
Но это не все , теперь нам нужно в файле blog/__init__.py (да да , он не всегда должен быть пустым) добавить
default_app_config = 'blog.apps.BlogConfig'
Все просто , но некоторые на эту тему пишут огроменныестатьи .Кстати, огромное спасибо за статью.
Попробуем добавить фотографию через административную панель Все работает. Запись добавляется и фотографии загружаются в папку media/photos/
В заключении хотелось бы отметить, что мы удачно справились с тем ,что запланировали. Единственной проблемой в вашем пути может стать установка PILLOW К сожалению, для многих систем это нетривиальная проблема. Но надеюсь , вы справитесь с этим, если будут проблемы , то обращайтесь в Google.!!! Если смогу , то сам помогу , но Google более надежней