20 сентября 2016 г. 0:46

131

Простое приложение на Django.Instablog.Часть 2

Тут мы просто создадим наше первое приложение под названием blog и добавим туда простую модель для хранения фотографий. И подключим наше приложение к адмнистративной панели

Создаем приложение 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 более надежней

comments powered by Disqus