С одной стороны входящее в django.contrib
приложение flatpages
удобно и практично, с другой же стороны добавленные через него страницы проходят мимо VCS, что порой бывает неправильно. Нехорошо, если, к примеру, при разворачивании проекта у нового разработчика будет недоставать нескольких нужных страниц. Исправим.
Итак, задача. Нужно создать страницу «О компании», но так, чтобы при разворачивании проекта страница уже существовала с нужным текстом, редактирование которого доступно через админку наряду с любыми другими простыми страницами.
Вместо того, чтобы создавать страницу из админки аки белые контент-менеджеры, мы, отважные программисты, не боящиеся чёрной консоли и страшного кода, сделаем миграцию данных:
python manage.py makemigrations --empty extendflatpages
Опция --empty отмечает, что миграцию нужно создать пустой. Но тогда нужно указать, в каком приложении. Я использую своё собственное приложение, называющееся extendflatpages, расширяющее функционал стандартного джанговского. Вы если используете стандартное, то разместите миграцию в своём главном приложении. Подробнее о миграции данных можно почитать здесь: /rel1.9/topics/migrations.html#data-migrations.
Класс миграции должен получиться примерно таким:
class Migration(migrations.Migration):
initial = True
dependencies = [
('yourappname', '0001_initial'),
]
operations = [
migrations.RunPython(add_page),
]
где add_page
— имя функции, которая сделает основную работу.
Нам потребуется получить две модели:
Page = apps.get_model("flatpages", "Flatpage")
Site = apps.get_model("sites", "Site")
Модель Site
нужна из-за требований приложения flatpages
. Каждая страница привязывается к сайту. Чаще всего сайт один, известно какой, это в settings.py прописано, так что и выберем его:
site = Site.objects.get(id=settings.SITE_ID)
Теперь можно создавать страницу:
page = Page(
url="/about/",
title="О компании",
content="""
Мы — стремительно развивающаяся молодая компания, состоящая из амбициозных и энергичных…
""",
template_name="flatpages/default.html"
)
Теперь можно эту страницу сохранить, а затем привязать к сайту. Именно в такой последовательности, many2many подразумевает, что у обоих связываемых моделей уже есть id:
page.save()
page.sites.add(site)
Привязывать к сайту обязательно, иначе страница создастся, но отображаться не будет.
Теперь всего лишь выполняем
python manage.py migrate
и получаем новую страницу, не заглядывая в админку. Новый разработчик, подключенный к проекту уже не на начальном этапе, тоже получит эту страницу, только развернув проект у себя.