В качестве хобби, я решил открыть для себя мир веб-разработки, попутно освещая свои успехи, а может и неудачи на пути к просветлению…

В настоящее время я публично описываю процесс создания веб-сайта с нуля на Django и Bootstrap, где задача разработать такие приложения как: аккаунты, вопросы, статьи и книги.

В проекте решаются только реальные задачи, которые почему-то так любят обходить стороной в учебной литературе.

Создание веб-сайта с нуля на Django и Bootstrap. Статьи. Список статей и их содержимое. Шаблоны

Сергей Серов

Шаблоны

По традиции в заключительной части мы описываем шаблоны.

Шаблон списка статей

В каталоге 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&amp;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>