Мы почти закончили с приложением для портфолио и нам осталось создать 2 шаблона:
- project_index - индексный;
- project_detail - детальный.
Давайте начнем с индексного шаблона project_index. Для вывода проектов на индексную страницу воспользуемся Джанговским циклом for:
{% for project in projects %}
{# Разметка для вывода отдельного проекта #}
{% endfor %}
Создадим новый файл projects/templates/project_index.html и добавим в него следующее содержимое:
{% extends "base.html" %}
{% load static %}
{% block page_content %}
<h1>Проекты</h1>
<div class="row">
{% for project in projects %}
<div class="col-md-4">
<div class="card mb-2">
<img class="card-img-top" src="/{% static project.image %}">
<div class="card-body">
<h5 class="card-title">{{ project.title }}</h5>
<p class="card-text">{{ project.description }}</p>
<a href="/{% url 'project_detail' project.pk %}"
class="btn btn-primary">
Подробнее...
</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
В первой строчке мы указываем, что данный файл расширяет содержимое шаблона из файла base.html. Для придания дополнительной красоты изменим содержимое файла base.html на следующее:
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="/{% url 'project_index' %}">Мое персональное портфолио</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="/{% url 'project_index' %}">Проекты</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/">Блог</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">
{% block page_content %}{% endblock %}
</div>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
Вернемся к файлу project_index.html.
Строчка 2 {% load static %} указывает Django, что нужно загрузить статическое содержимое из папки static, которую нужно создать. Туда и помещаем наши картинки (в папку /projects/static/img/).
Чтобы картинки отображались в Windows нужно в файл settings.py добавить следующие 2 строчки:
STATIC_ROOT = ''
STATICFILES_DIRS = ( os.path.join('static'), )
В строчке 13 файла project_index.html в атрибуте href ({% url 'project_detail' project.pk %}) мы указываем путь (path) c именем (name) project_detail. Это имя указано в файле my-portfolio\projects\urls.py. И также передаем атрибут project.pk (id проекта из БД). Общая форма для создания ссылки такая:
{% url '<url path name>' <view_function_arguments> %}
Осталось добавить шаблон для детальной страницы.
Рядом с файлом project_index.html создайте новый файл с названием project_detail.html.
Добавьте в него следующее содержимое:
{% extends "base.html" %}
{% load static %}
{% block page_content %}
<h1>{{ project.title }}</h1>
<div class="row">
<div class="col-md-8">
<img src="/{% static project.image %}" alt="" width="100%">
</div>
<div class="col-md-4">
<h5>Об этом проекте:</h5>
<p>{{ project.description }}</p>
<br>
<h5>Язык программирования:</h5>
<p>{{ project.technology }}</p>
<a href="/{% url 'project_index' %}"
class="btn btn-primary">
← Вернуться к списку проектов
</a>
</div>
</div>
{% endblock %}