Изменение базового шаблона проекта
По мере работы со стилями Bootstrap вам может очень пригодится данная шпаргалка.
Чтобы подключить Bootstrap 5 стили CSS, дополнительный JS-код в нашем проекте нам необходимо изменить базовый шаблон base.html и добавить в него следующий код внутри тега <head>:
{# Load the django_bootstrap5 library #}
{% load django_bootstrap5 %}
{# Load CSS and JavaScript separately#}
{% bootstrap_css %}
{% bootstrap_javascript %}
И в результате давайте приведем наш base.html к следующему виду:
{% load blog_tags %}
{% load static %}
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %}</title>
{% load django_bootstrap5 %}
{% bootstrap_css %}
{% bootstrap_javascript %}
</head>
<body class="d-flex flex-column min-vh-100">
<!-- Responsive navbar-->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="/">My First Blog Django 5</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-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 ms-auto mb-2 mb-lg-0">
{% if user.is_authenticated %}
<li class="nav-item"><a class="nav-link" href="{% url 'users-profile' %}"><img
class="rounded-circle" width="30" src="{{ user.profile.avatar.url }}"/> {{ user.username }}
</a></li>
<li class="nav-item">
<form action="{% url 'logout' %}" method="post">{% csrf_token %}
<a href="#" class="nav-link" onclick="parentNode.submit();">Log Out</a>
</form>
</li>
{% else %}
<li class="nav-item"><a class="nav-link" href="{% url 'login' %}">Log In</a></li>
{% endif %}
</ul>
</div>
</div>
</nav>
<!-- Page content-->
<div class="container mt-5">
<div class="row">
<div class="col-lg-8">
{% if messages %}
{% for message in messages %}
<div class="container d-flex align-items-center justify-content-center">
<div class="alert alert-warning alert-dismissible fade show w-50 d-block" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
</div>
{% endfor %}
{% endif %}
{% block content %}
{% endblock %}
</div>
<!-- Widgets-->
<div class="col-lg-4">
<div class="card mb-4">
<div class="card-header">This is my blog.</div>
<div class="card-body">
I've written {% total_posts %} posts so far.
</div>
</div>
<!-- Search widget-->
<div class="card mb-4">
<div class="card-header">Search</div>
<div class="card-body">
<div class="input-group">
<form action="/search/" method="get" class="input-group">
<input type="text" name="query" class="form-control" placeholder="Enter search term..."
required="" id="id_query">
<button class="btn btn-primary" id="button-search" type="submit">Go!</button>
</form>
</div>
</div>
</div>
<!-- Latest posts widget-->
<div class="card mb-4">
<div class="list-group">
<a class="list-group-item list-group-item-action active" aria-current="true">
Latest posts
</a>
{% show_latest_posts 3 %}
</div>
</div>
<div class="card mb-4">
<div class="list-group">
<a class="list-group-item list-group-item-action active" aria-current="true">
Most commented posts
</a>
{% get_most_commented_posts as most_commented_posts %}
{% for post in most_commented_posts %}
<a class="list-group-item list-group-item-action"
href="{{ post.get_absolute_url }}">{{ post.title }}</a>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
<!-- Footer-->
<footer class="py-5 bg-dark mt-2 mt-auto">
<div class="container"><p class="m-0 text-center text-white">Copyright © Your Website 2023, Powered by
Django</p></div>
</footer>
</body>
</html>
А теперь разберем все блоки кода по порядку, в самом верху кода мы подключили Bootstrap стили и скрипты, и далее мы добавили адаптивный блок навигации:
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="/">My First Blog Django 4</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-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 ms-auto mb-2 mb-lg-0">
{% if user.is_authenticated %}
<li class="nav-item"><a class="nav-link" href="{% url 'users-profile' %}"><img
class="rounded-circle" width="30" src="{{ user.profile.avatar.url }}"/> {{ user.username }}
</a></li>
<li class="nav-item"><a class="nav-link" href="{% url 'logout' %}">Log Out</a></li>
{% else %}
<li class="nav-item"><a class="nav-link" href="{% url 'login' %}">Log In</a></li>
{% endif %}
</ul>
</div>
</div>
</nav>
И теперь мы имеем вот такой вид нашей шапки сайта:
И для мобильных устройств:
В следующем блоке кода мы размещаем наш основной контент сайта. Также мы сделали обработку ошибок с помощью всплывающего модального окна:
<div class="container mt-5">
<div class="row">
<div class="col-lg-8">
{% if messages %}
{% for message in messages %}
<div class="container d-flex align-items-center justify-content-center">
<div class="alert alert-warning alert-dismissible fade show w-50 d-block" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
</div>
{% endfor %}
{% endif %}
{% block content %}
{% endblock %}
</div>
Также мы полностью переработали наш сайдбар. А именно мы добавили в него поиск по нашему блогу и добавили новый дизайн:
<!-- Widgets-->
<div class="col-lg-4">
<div class="card mb-4">
<div class="card-header">This is my blog.</div>
<div class="card-body">
I've written {% total_posts %} posts so far.
</div>
</div>
<!-- Search widget-->
<div class="card mb-4">
<div class="card-header">Search</div>
<div class="card-body">
<div class="input-group">
<form action="/search/" method="get" class="input-group">
<input type="text" name="query" class="form-control" placeholder="Enter search term..."
required="" id="id_query">
<button class="btn btn-primary" id="button-search" type="submit">Go!</button>
</form>
</div>
</div>
</div>
<!-- Latest posts widget-->
<div class="card mb-4">
<div class="list-group">
<a class="list-group-item list-group-item-action active" aria-current="true">
Latest posts
</a>
{% show_latest_posts 3 %}
</div>
</div>
<div class="card mb-4">
<div class="list-group">
<a class="list-group-item list-group-item-action active" aria-current="true">
Most commented posts
</a>
{% get_most_commented_posts as most_commented_posts %}
{% for post in most_commented_posts %}
<a class="list-group-item list-group-item-action"
href="{{ post.get_absolute_url }}">{{ post.title }}</a>
{% endfor %}
</div>
</div>
</div>
И в самый низ страницы мы добавили небольшой простой футер:
<footer class="py-5 bg-dark mt-2">
<div class="container"><p class="m-0 text-center text-white">Copyright © Your Website 2023, Powered by
Django</p></div>
</footer>
Далее давайте откроем наш latest_posts.html и изменим в нем код на следующий:
{% for post in latest_posts %}
<a class="list-group-item list-group-item-action" href="{{ post.get_absolute_url }}">{{ post.title }}</a>
{% endfor %}
В данном коде, мы добавили к ссылкам необходимые классы стилей CSS.
Давайте проверим наш дизайн сайта:
Как мы видим, мы кардинально переработали макет нашего сайта. Продолжим доработку дизайна в следующем шаге.