Статичные страницы и класс TemplateView

Вы уже создали несколько страниц и view-функций в проекте Yatube. Но помимо страниц с динамическим содержимым на сайте могут понадобиться и простые статичные страницы:

  • контактная информация,
  • правила и помощь,
  • юридическая информация

…и множество других.В Django есть view-класс TemplateView, который создан для таких случаев. Этот простой класс по умолчанию обрабатывает только GET-запросы и возвращает страницу, сформированную на основе указанного шаблона и словаря контекста (словарь не обязателен: содержимое страницы может быть описано прямо в шаблоне).

Страница в три счёта

Раз: view-класс

# views.py
# Импорт класса TemplateView, чтобы унаследоваться от него
from django.views.generic.base import TemplateView


class JustStaticPage(TemplateView):
    # В переменной template_name обязательно указывается имя шаблона,
    # на основе которого будет создана возвращаемая страница
    template_name = 'app_name/just_page.html' 

Два: шаблон

<!-- templates/app_name/just_page.html -->
<html>
  <head>
    <title>Очень простая страница</title>
  </head>    
  <body>
    <div class="header">JUST SITE</div>
    <h1>Очень простая страница</h1>
    <p>На создание этой страницы у меня ушло пять минут! Ай да я.</p>
    <div class="footer">© JUST SITE, все права </div>
  </body>
</html> 

Три: путь

# urls.py
...
urlpatterns = [
    ...
    path('justpage/', views.JustStaticPage.as_view())
] 

Готово!

По ссылке /justpage/ откроется страница, где хвалят разработчика этой страницы.

Можно и с контекстом

Класс TemplateView может передавать в шаблон словарь context, для этого нужно переопределить метод класса get_context_data():

# views.py
from django.views.generic.base import TemplateView


class JustStaticPage(TemplateView):
    template_name = 'app_name/just_page.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # Здесь можно произвести какие-то действия для создания контекста.
        # Для примера в словарь просто передаются две строки
        context['just_title'] = 'Очень простая страница'
        context['just_text'] = ('На создание этой страницы '
                                'у меня ушло пять минут! Ай да я.')
        return context 

А шаблон, как и всегда, может рендериться на основе нескольких других шаблонов и словаря context:

<!-- templates/app_name/just_page.html -->
<html>
  <head>
    <title>{{ just_title }}</title>
  </head>
  <body>
    {% include 'includes/header.html' %}
    <h1>{{ just_title }}</h1>
    <p>{{ just_text }}</p>
    {% include 'includes/footer.html' %}
  </body>
</html> 

Класс TemplateView отлично подходит

  • для отображения простых статичных страниц, например «Об авторе» или «О компании»;
  • для отображения страниц с простым контекстом;
  • для отображения страниц, всё содержимое которых описано в HTML-шаблоне.

Класс TemplateViewне стоит применять

  • для работы с любыми HTTP-запросами, кроме GET;
  • для операций CRUD. Не имеет смысла расширять класс TemplateView, для CRUD есть специальные классы — FormViewCreateView и UpdateView.

Особенности класса TemplateView:

  • По умолчанию класс TemplateView ответит только на GET-запрос. На запросы других типов класс вернёт код 405: HttpResponseNotAllowed.
  • Класс не поддерживает формы.
  • Переменная template_name (путь к файлу шаблона) обязательно должна быть объявлена в классе.

С остальными особенностями этого класса можно познакомиться в официальной документации.

Задание

Создайте в проекте Yatube две статичные страницы на основе TemplateView: «Об авторе» и «Технологии». Весь текст вставьте прямо в шаблон, словарь context передавать не нужно.Адреса страниц должны быть такими:

  • Об авторе/about/author/
  • Технологии/about/tech/

Страница «Об авторе»

На этой странице опубликуйте информацию о себе. Дайте ссылки на ваш аккаунт в Github, на страницу вашего резюме и на любые другие ваши ресурсы в сети, расскажите, что вас вдохновляет, как вы пришли в мир программирования и как вы себя ощущаете в этом мире.Если во время работы вам помогал ваш кот, собака, жёлтая резиновая уточка или другое домашнее животное — обязательно упомяните об этом: так принято в среде программистов; без этого вас могут не взять на работу в приличную компанию!Хорошим тоном считается выложить фотографию своей рабочей кружки или образцового порядка на вашем рабочем столе. Картинку можно положить в папку /static. Не забудьте уменьшить размер файла до приемлемого.

Страница «Технологии»

На этой странице можно рассказать, какие программные инструменты вы применили для создания этого сайта, какие навыки вам помогли, с чем вы хорошо разобрались, а с чем — не очень. Картинки и нестандартные подходы приветствуются: эта страница может получиться очень интересной.

Приложение about

Для структурирования проекта создайте приложение about, оно будет управлять статичными страницами, описывающими проект.Запустите виртуальное окружение проекта; из рабочей директории проекта выполните в консоли команду python3 manage.py startapp aboutПосле создания приложения не забудьте зарегистрировать его в settings.py.

urls.py для статических страниц

Все URL проекта, начинающиеся с префикса about/, должны обрабатываться в about/urls.py.

Добавьте в головной urls.py новый path():

urlpatterns = [
    ...
    path('about/', include('about.urls', namespace='about')),
] 

В файле about/urls.py будут обрабатываться два адреса:

# файл about/urls.py
from django.urls import path
from . import views


app_name = 'about'

urlpatterns = [
    path('author/', views.AboutAuthorView.as_view(), name='author'),
    path('tech/', views.AboutTechView.as_view(), name='tech'),
] 

Строка app_name = 'about' — обязательна. Без неё namespace не сработает.

View-классы для статических страниц

Опишите два view-класса, наследующихся от TemplateViewAboutAuthorView и AboutTechView. Каждый из них должен вызывать свой шаблон; словарь с контекстом передавать не нужно.

# about/views.py
# Импортировать TemplateView

# Описать класс AboutAuthorView для страницы about/author

# Описать класс AboutTechView для страницы about/tech 

Шаблоны для статических страниц

В директорию /templates добавьте шаблоны статичных страниц. Они должны быть доступны по адресам templates/about/author.html и templates/about/tech.htmlКод шаблона author.html может быть таким:

<!-- templates/about/author.html -->
{% extends "base.html" %}
{% block title %}Об авторе проекта{% endblock %}
{% block content %}
<h1>Привет, я автор</h1>
<p>
  Тут я размещу информацию о себе используя свои умения верстать.
  Картинки, блоки, элементы бустрап. А может быть, просто напишу несколько абзацев текста. 
</p>
{% endblock %} 

Код шаблона tech.html:

<!-- templates/about/tech.html -->
{% extends "base.html" %}
{% block title %}Технологии{% endblock %}
{% block content %}
{% comment %} Колонки с отступом сверху и снизу {% endcomment %}
<div class="row">
  <h1>Вот что я умею</h1>
  {% comment %}
    Боковой блок со списком технологий 
    Займет всю ширину блока на мобильном
    и 25% при размерах экрана ≥768px
  {% endcomment %}
  <aside class="col-12 col-md-3">
    <ul class="list-group list-group-flush">
      <li class="list-group-item">
        Python
      </li>
      <li class="list-group-item">
        Django
      </li>
    </ul>
  </aside>
  {% comment %}
    Статья  
    Займет всю ширину блока на мобильном
    и 75% при размерах экрана ≥768px
  {% endcomment %}
  <article class="col-12 col-md-9">
    <p>Текст страницы "Технологии"</p>
  </article>
</div>
{% endblock %} 





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: