Шаблоны
По традиции в заключительной части мы описываем шаблоны.
Шаблон списка статей
В каталоге templates создаем подкаталог articles и в нем файл index.html:
{% extends 'base.html' %}
{% block title %}Статьи{% endblock %}
{% block main %}
<div class="articles-index">
{% if articles %}
<h1>
Статьи
<a href="{% url 'articles:feed' %}">
<span class="sr-only">Лента последних статей</span>
<i class="fa fa-rss fa-fw" aria-hidden="true"></i>
</a>
</h1>
{% for article in articles %}
<div class="article">
<div class="row">
<div class="col-sm-3">
<time class="published" datetime="{{ article.published|date:'c' }}">{{ article.published|date }}</time>
<address class="sr-only">{{ SITE_AUTHOR }}</address>
</div>
<div class="col-sm-9">
<h2 class="title">
<a href="{{ article.get_absolute_url }}">{{ article.title }}</a>
</h2>
</div>
</div>
</div>
{% endfor %}
{% else %}
<h1>Видимо что-то пошло не так и все статьи исчезли...</h1>
{% endif %}
</div>
{% endblock %}
Шаблон содержимого статьи
Далее создаем второй шаблон с названием article.html:
{% extends 'base.html' %}
{% block title %}{{ article.title }}{% endblock %}
{% block main %}
<div class="articles-article">
<h1 class="title">{{ article.title }}</h1>
{% if article.published %}
<time class="published" datetime="{{ article.published|date:'c' }}">{{ article.published|date }}</time>
{% else %}
<span class="published">Неопубликованная статья</span>
{% endif %}
<address class="sr-only">{{ SITE_AUTHOR }}</address>
{% if user.is_superuser %}
<a href="{{ article.get_admin_url }}">Редактировать</a>
{% endif %}
<div class="text">
{{ article.text|safe }}
</div>
</div>
{% endblock %}
Базовый шаблон проекта
В завершение нам необходимо добавить в базовый шаблон ссылку на фид мета-тегом. Открываем base.html и приводом к следующему содержимому:
{% load static %}
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="{{ SITE_AUTHOR }}">
<title>{% block title %}{% endblock %} | {{ SITE_TITLE }}</title>
<link rel="alternate" type="application/atom+xml" title="{{ SITE_TITLE }}" href="{% url 'articles:feed' %}">
<!-- Bootstrap -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
<!-- Style -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700%7CUbuntu:700&subset=cyrillic" rel="stylesheet">
<link rel="stylesheet" href="{% static 'style.css' %}">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<header>
<nav class="navbar navbar-default navbar-static-top">
<div class="container">
<ul class="nav navbar-nav navbar-right">
{% if user.is_authenticated %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-user fa-fw" aria-hidden="true"></i>
{{ user.username }}
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li>
<a href="{% url 'accounts:change_password' %}">
<i class="fa fa-key fa-fw" aria-hidden="true"></i>
Смена пароля
</a>
</li>
<li>
<a href="{% url 'accounts:change_email' %}">
<i class="fa fa-envelope-o fa-fw" aria-hidden="true"></i>
Смена почты
</a>
</li>
<li><a href="{% url 'accounts:logout' %}">
<i class="fa fa-sign-out fa-fw" aria-hidden="true"></i>
Выход
</a></li>
</ul>
</li>
{% else %}
<li>
<a href="{% url 'accounts:login' %}">
<i class="fa fa-sign-in fa-fw" aria-hidden="true"></i>
Войти
</a>
</li>
{% endif %}
</ul>
</div>
</nav>
<div class="container">
<div class="about">
<div class="row">
<div class="col-sm-8">
<h2 class="title"><a href="/">{{ SITE_TITLE }}</a></h2>
<h3 class="subtitle">{{ SITE_SUBTITLE }}</h3>
</div>
<div class="col-sm-4">
<address class="contacts">
<div class="mail">
<span class="sr-only">Адрес электронной почты</span>
<i class="fa fa-envelope-o fa-fw" aria-hidden="true"></i>
Почта
</div>
<div class="location">
<span class="sr-only">Местоположение</span>
<i class="fa fa-globe fa-fw" aria-hidden="true"></i>
Местоположение
</div>
</address>
</div>
</div>
<div class="description">
<p>
В течение десяти лет работы на крупных производственных предприятиях заполучил опыт создания служб с нуля,
по направлениям: охрана труда, пожарная, промышленная и экологическая безопасность.
</p>
<p>
Проведу для Вас полный аудит или разработаю комплекты документов по всем вышеперечисленным направлениям.
</p>
</div>
</div>
</div>
</header>
<main>
<div class="container">
{% block main %}{% endblock %}
</div>
</main>
</body>
</html>