Шаблоны Django
Пришло время отобразить данные на сайте! Django поможет нам с этим при помощи встроенных тегов шаблонов.
Что представляют из себя теги шаблонов?
Как видишь, в HTML нельзя помещать код Python, поскольку браузеры не понимают его. Они знают только HTML. Мы помним, что HTML статичен, в то время как Python позволяет динамические изменения.
Теги шаблонов Django позволяют нам вставлять Python в HTML, так что ты можешь создавать динамические веб-сайты быстрее и проще. То, что надо!
Отображаем шаблон списка записей
В предыдущей главе мы передали нашему шаблону список записей в переменной posts
. Теперь мы отобразим его в HTML.
Чтобы вставить переменную в шаблон Django, нам нужно использовать двойные фигурные скобки с именем переменной внутри:
blog/templates/blog/post_list.html
{{ posts }}
Попробуй это в шаблоне blog/templates/blog/post_list.html
. Замени всё, начиная со второго <div>
и вплоть до третьего </div>
кодом {{ posts }}
. Сохрани файл и обнови страницу, чтобы увидеть результат:
Как ты можешь заметить, мы получили следующую строку:
blog/templates/blog/post_list.html
<QuerySet [<Post: My second post>, <Post: My first post>]>
Это показывает, что Django понял переменную как список объектов. Помнишь из главы Введение в Python, как мы можем аккуратно отобразить список? Правильно, циклом for! В шаблонах Django ты можешь использовать их таким образом:
blog/templates/blog/post_list.html
{% for post in posts %}
{{ post }}
{% endfor %}
Попробуй вставить это в свой шаблон.
Сработало! Но мы хотим, чтобы они отображались как статические записи, которые мы создавали в главе Введение в HTML. Ты можешь смешивать HTML и теги шаблонов. Наш элемент body
будет выглядеть следующим образом:
blog/templates/blog/post_list.html
<div>
<h1><a href="/">Django Girls Blog</a></h1>
</div>
{% for post in posts %}
<div>
<p>published: {{ post.published_date }}</p>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endfor %}
Всё, что ты поместишь между {% for %}
и {% endfor %}
, будет повторено для каждого объекта в списке. Обнови страницу:
Ты заметила, что мы использовали немного другую запись в этот раз: {{ post.title }}
или {{ post.text }}
? Мы обращаемся к различным полям нашей модели Post
. Также |linebreaksbr
прогоняет текст через фильтр для преобразования переносов строк в параграфы.
Ещё один момент
Пришло время ещё раз убедиться, что наш сайт будет работать в сети, согласна? Попробуем развернуть новую версию сайта на PythonAnywhere. Краткий обзор необходимых шагов...
- Сначала загружаем код на GitHub
command-line
$ git status
[...]
$ git add --all .
$ git status
[...]
$ git commit -m "Modified templates to display posts from database."
[...]
$ git push
- Затем заходим на PythonAnywhere, открываем Bash console и набираем команду:
PythonAnywhere command-line
$ cd $USER.pythonanywhere.com
$ git pull
[...]
- Наконец, переключаемся на вкладку Web и жмём кнопку Reload. Обновления запущены в жизнь! Даже если записи в твоём блоге на PythonAnywhere отличаются от записей в блоге на локальном сервере, то всё в порядке. Базы данных на твоём локальном компьютере и на PythonAnywhere не синхронизируются, в отличиет от остальных файлов проекта.
Поздравляем! Теперь попробуй добавить новые записи через панель администратора Django (не забывай указывать published_date!). Удостоверься, что ты в панели администратора своего сайта на PythonAnywhere (https://yourname.pythonanywhere.com/admin). Затем обнови страницу, чтобы проверить, появились ли новые записи.
Работает как по волшебству? Есть чем гордиться! Отойди от компьютера на секунду — ты заслужила перерыв :)