Django 23. Добавляем sitemap и счётчики
Как и для любого сайта, аналитика посещений очень важна. Как и индексирование сайта в поисковых системах.
В этом посте опишу, как удобно встроить счётчики Яндекс.Метрики и Google Analytics в шаблон сайта, как создать файлы
Начнём с аналитики и счётчиков.
Дабы не засорять код базового шаблона длинными скриптами со счётчиками Яндекса и Google, установим пакет
В этом же файле пропишите ваши номера счётчиков:
Все доступные виды счётчиков, можно найти в официальной документации: https://django-analytical.readthedocs.io/en/latest/
Как и для любого сайта, аналитика посещений очень важна. Как и индексирование сайта в поисковых системах.
В этом посте опишу, как удобно встроить счётчики Яндекс.Метрики и Google Analytics в шаблон сайта, как создать файлы
sitemap.xml и robots.txt.Начнём с аналитики и счётчиков.
Дабы не засорять код базового шаблона длинными скриптами со счётчиками Яндекса и Google, установим пакет
pip install django-analytical. Пропишем его в requirements.txt и добавим analytical в INSTALLED_APPS.В этом же файле пропишите ваши номера счётчиков:
# Статистика
YANDEX_METRICA_COUNTER_ID = ''
GOOGLE_ANALYTICS_GTAG_PROPERTY_ID = ''
Все доступные виды счётчиков, можно найти в официальной документации: https://django-analytical.readthedocs.io/en/latest/
Затем перейдём в файл
В самом верху файла, после тэга подключения статики, добавьте тег
Затем, в блоке
Теперь займёмся настройкой файла
Перейдём в файл
Модуль
Выполним миграции
Запустите Django и перейдите в панель администратора. Там будет новый пункт меню
Откройте его. В списке увидите сайт
На открывшейся странице введите адрес вашего сайта, если он всё ещё на локальной машине, то введите
Cоздадим класс
В теле класса пропишем пять методов(для класса категории, их будет четыре):
-
-
-
-
-
Код:
Перейдём в файл
Создадим словарь, в котором перечислим наши классы из файла
Первое, что необходимо сделать - это создать сам файл. Перейдём в директорию
В нём пропишите необходимые разрешения или запреты для поисковых роботов, например, самый простой вариант:
Откроем файл
Файлы к посту, можно получить в боте по коду: 276141
base.html. Нам необходимо вставить теги аналитики.В самом верху файла, после тэга подключения статики, добавьте тег
{% load analytical %}.Затем, в блоке
<head> добавьте два тега. Один в самое начало блока, второй в самый конец:{% analytical_head_top %}
{% analytical_head_bottom %}
Точно также и со следующими двумя тегами, но уже в блок <body>:{% analytical_body_top %}
{% analytical_body_bottom %}
На этом всё. В скором времени, на странице счётчика начнёт появляться статистика.Теперь займёмся настройкой файла
sitemap.xml.Перейдём в файл
settings.py и в INSTALLED_APPS добавим следующие модули:'django.contrib.sites',И добавим переменную
'django.contrib.sitemaps',
SITE_ID = 1 в начало файла, после переменной BASE_DIR.Модуль
django.contrib.sites добавляет поддержку нескольких сайтов, это нам не нужно, однако это необходимо модулю django.contrib.sitemaps.Выполним миграции
python manage.py migrate.Запустите Django и перейдите в панель администратора. Там будет новый пункт меню
Сайты.Откройте его. В списке увидите сайт
example.com. Нажмите на него, что бы перейти к редактированию.На открывшейся странице введите адрес вашего сайта, если он всё ещё на локальной машине, то введите
127.0.0.1
В директории приложения создадим файл sitemap.py.Cоздадим класс
PostSitemap унаследованный от Sitemap.В теле класса пропишем пять методов(для класса категории, их будет четыре):
-
items - метод, возвращающий все объекты модели. В нашем случае, все опубликованные посты-
lastmod - метод, возвращающий дату обновления поста. Данный метод не нужен для класса с категориями, поскольку у нас нет поля изменения категории-
priority - метод, возвращающий приоритет для объектов модели. Приоритет определяется от 0.0(наименьший), до 1.0(наивысший).-
changefreq - метод, возвращающий периодичность обновления постов. Доступные варианты: "always", "hourly", "daily", "weekly", "monthly", "yearly", "never".-
location - метод, возвращающий URL-адрес объекта. Обратите внимание на то, что он заполняется также, как и метод get_absolute_url.Код:
from django.contrib.sitemaps import SitemapПо аналогии создайте классы для других моделей, которые необходимо внести в файл
from django.urls import reverse
from . import models
class PostSitemap(Sitemap):
def items(self):
return models.PostModel.objects.filter(status=models.PostModel.Status.PUBLISHED)
def lastmod(self, obj):
return obj.updated
def priority(self, obj):
return 0.8
def changefreq(self, obj):
return "weekly"
def location(self, obj):
return reverse('blog:post_page', args=[obj.pk, obj.slug])
sitemap.xml, например, модель категории.Перейдём в файл
urls.py в директории проекта.Создадим словарь, в котором перечислим наши классы из файла
sitemap.py и в конец urlpatterns добавим строку для доступа к файлу:from django.contrib.sitemaps.views import sitemapДля создания файла
from blog.sitemap import PostSitemap, CategorySitemap
sitemaps = {
'PostSitemap': PostSitemap,
'CategorySitemap': CategorySitemap,
}
urlpatterns = [
# ...
path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]
robots.txt, достаточно сделать всего два действия.Первое, что необходимо сделать - это создать сам файл. Перейдём в директорию
static и в корне создадим файл robots.txt.В нём пропишите необходимые разрешения или запреты для поисковых роботов, например, самый простой вариант:
User-agent: *Второе, что необходимо сделать - это прописать URL-паттерн для доступа к файлу.
Disallow: /admin/
Откроем файл
urls.py в директории проекта и в конец urlpatterns добавим следующую строку:from django.urls import path, include, re_pathНа этом всё. Осталось добавить файлы в отслеживание поисковых систем.
from django.views.static import serve
re_path(r'^robots.txt$', serve, {'document_root': settings.STATIC_ROOT, 'path': "robots.txt"}),
Файлы к посту, можно получить в боте по коду: 276141
👍1
Django 24. Связь модели файла и поста
У нас есть модель для хранения файлов и модель поста.
Для того, чтобы у поста, можно было выбирать файл, а у файла был доступ к полям поста, их нужно связать.
Внешний ключ.
Откроем файл
Создадим переменную
В параметрах укажем:
- Модель файла.
- Действия при удалении файла. Если удалим файл, пост не будет удалён, значение поля обнулится.
- Разрешение быть пустым и не обязательным полем.
- Название поля.
- "Зависимое" имя поля.
У нас есть модель для хранения файлов и модель поста.
Для того, чтобы у поста, можно было выбирать файл, а у файла был доступ к полям поста, их нужно связать.
Внешний ключ.
Откроем файл
models.py и пропишем внешний ключ в модели поста PostModel к модели файла.Создадим переменную
file, сделав её полем Один-к-Одному(OneToOneField). В параметрах укажем:
- Модель файла.
- Действия при удалении файла. Если удалим файл, пост не будет удалён, значение поля обнулится.
- Разрешение быть пустым и не обязательным полем.
- Название поля.
- "Зависимое" имя поля.
file = models.OneToOneField(PostFilesModel,Поле
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name="Файл",
related_name="post")
related_name позволит обращаться из объекта файла к связанному объекту поста.Генерация кода для файла.
Отвлечёмся от основной темы поста.
Не уходя из файла
В классе
Перейдём в файл
Применим миграции:
Возвращаемся к основной теме поста.
Для того чтобы отобразить ссылку на файл, в шаблоне необходимо обращаться к полю файл в модели файла и запрашивать его путь.
Изменим сериализатор, чтобы он возвращал не только название файла и путь до него, но и поля из поста, например, ссылку на пост.
Добавим два новых поля:
-
-
И метод, получающий URL поста, и добавляющий к нему
В методе используем
Полный код сериализатора:
Файлы к посту, можно получить в боте по коду: 187343
Отвлечёмся от основной темы поста.
Не уходя из файла
models.py добавим генерацию кода для файла.В классе
PostFilesModel создадим метод генерации уникального кода и переопределим метод сохранения модели. Должно получиться так:import randomНе обязательно, но поле
def save(self, *args, **kwargs):
if not self.code:
self.code = self.generate_unique_code()
super().save(*args, **kwargs)
@staticmethod
def generate_unique_code():
code = random.randint(100000, 999999)
while PostFilesModel.objects.filter(code=code).exists():
code = random.randint(100000, 999999)
return code
code можно сделать полем "только для чтения".Перейдём в файл
admin.py и найдём класс PostFilesAdmin. Добавим в него всего одно поле: readonly_fields = ('code',)
Теперь код будет генерироваться при создании объекта, а в панели администратора нельзя будет его изменить.Применим миграции:
python manage.py makemigrationsДобавление в шаблон.
python manage.py migrate
Возвращаемся к основной теме поста.
Для того чтобы отобразить ссылку на файл, в шаблоне необходимо обращаться к полю файл в модели файла и запрашивать его путь.
<h2 class="mb-3">Дополнительные материалы</h2>Изменение сериализатора.
<a href="{{ post.file.file.path }}" class="mb-1">Скачать материалы и исходный код с сайта.</a>
<p class="mt-1">Или в <a href="https://t.iss.one/press_any_button_bot">Telegram-боте</a> по коду: <b>{{ post.file.code }}</b></p>
Изменим сериализатор, чтобы он возвращал не только название файла и путь до него, но и поля из поста, например, ссылку на пост.
Добавим два новых поля:
-
post_url - возвращающий ссылку на пост, для этого задействуем метод SerializerMethodField, поскольку получение полного URL до поста, это метод get_absolute_url. Параметр read_only=True позволяет, в случае если у файла нет связанного поста, получить None вместо исключения.-
post_telegram_link - возвращающий ссылку на пост в Telegram.И метод, получающий URL поста, и добавляющий к нему
UTM-метку для сбора статистики переходов.В методе используем
try-except, также чтобы избежать исключения, если у файла нет связанного поста. Полный код сериализатора:
class FileModelSerializer(serializers.ModelSerializer):Следующим постом внесём изменения в наш бот.
file_path = serializers.SerializerMethodField()
post_url = serializers.SerializerMethodField()
post_telegram_link = serializers.StringRelatedField(source='post.telegram_link', read_only=True)
class Meta:
model = models.PostFilesModel
fields = ['title', 'file_path', 'post_url', 'post_telegram_link']
@staticmethod
def get_file_path(obj):
return obj.file.path if obj.file else None
@staticmethod
def get_post_url(obj: models.PostFilesModel):
try:
url = obj.post.get_absolute_url()
utm_params = '?utm_source=telegram&utm_medium=bot&utm_campaign=get_file'
return get_current_site(None).domain + url + utm_params
except ObjectDoesNotExist:
return None
Файлы к посту, можно получить в боте по коду: 187343
❤1👍1
AIOgram3 11. Обновление для команды get_file
В прошлом посте, мы добавили связь между файлом и постом на сайте и добавили в передачу дополнительные данные.
Давайте обновим команду
Обновление /get_file.
Откроем файл
В функции
Находим строку, в которой отправляется файл -
В аргументах у нас указан всего один параметр, который передаётся в сообщение пользователю -
Давайте его расширим, добавив
Сообщение пользователю.
Теперь откроем файл
В аргументы функции добавим новые -
В прошлом посте, мы добавили связь между файлом и постом на сайте и добавили в передачу дополнительные данные.
Давайте обновим команду
/get_file.Обновление /get_file.
Откроем файл
send_file.py.В функции
send_file_get_data нам нужно добавить дополнительные поля, которые мы получаем по API.Находим строку, в которой отправляется файл -
bot.send_document. В аргументах у нас указан всего один параметр, который передаётся в сообщение пользователю -
caption=views.file_caption(data['title']).Давайте его расширим, добавив
post_url и post_telegram_link:await bot.send_document(message.chat.id, document=file, caption=views.file_caption(
data['title'],
data['post_url'],
data['post_telegram_link']
))
Сообщение пользователю.
Теперь откроем файл
views.py и найдём функцию file_caption.В аргументы функции добавим новые -
post_url и post_telegram_link.В теле функции сделаем проверку, если
Если же данных не будет, то возвращаем просто строку с заголовком файла.
Форматирование сообщений.
Ссылки можно отправлять и напрямую, но тогда ссылка будет занимать много места.
Telegram предоставляет три вида форматирования текста:
Я остановился на
Чтобы добавить поддержку
Найдём переменную
В параметры к классу Bot, сразу после передачи токена, добавим параметр
Чтобы проверить работу запустите бота и Django. В панели администратора Django откройте объект поста, в поле файл выберите имеющийся файл и сохраните.
Затем в боте запросите этот файл.
В сообщении к файлу, кроме заголовка, будут находиться ссылки на пост.
Файлы к посту, можно получить в боте по коду: 213307
post_url содержит данные, то мы возвращаем сообщение пользователю, в котором будет заголовок файла и две ссылки - на сайт и на канал.Если же данных не будет, то возвращаем просто строку с заголовком файла.
def file_caption(file_title, post_url, post_telegram_link):
if post_url:
return f'Файл к посту: {file_title}\nПост на сайте: <a href="{post_url}">pressanybutton.ru</a>\nПост на канале: <a href="{post_telegram_link}">Код на салфетке</a>'
return f'Файл к посту: {file_title}'
Форматирование сообщений.
Ссылки можно отправлять и напрямую, но тогда ссылка будет занимать много места.
Telegram предоставляет три вида форматирования текста:
markdown, markdownv2 и HTML.Я остановился на
HTML.Чтобы добавить поддержку
HTML-разметки в сообщениях, перейдём в файл settings.py.Найдём переменную
bot. В параметры к классу Bot, сразу после передачи токена, добавим параметр
parse_mode='HTML'.bot = Bot(token=Secrets.token, parse_mode='HTML')
Чтобы проверить работу запустите бота и Django. В панели администратора Django откройте объект поста, в поле файл выберите имеющийся файл и сохраните.
Затем в боте запросите этот файл.
В сообщении к файлу, кроме заголовка, будут находиться ссылки на пост.
Файлы к посту, можно получить в боте по коду: 213307
👍1
Приветствую!
В длинных постах можно запутаться поэтому, собираю воедино всё, что есть на данный момент.
Оглавления
Для удобства навигации есть посты с оглавлениями по темам:
Список всех постов по Django
Список всех постов по AIOgram3
Список всех постов по Docker
Список всех постов по Полезным инструментам
Чат
У канала есть чат. Присоединяйтесь!
Бот и сайт
У канала также есть бот с материалами к постам
И сайт(в процессе наполнения вышедшими постами)
Поддержка
Если вам нравится канал и выходящий материал, поделитесь ссылкой с людьми, кому это тоже может быть интересно.
В длинных постах можно запутаться поэтому, собираю воедино всё, что есть на данный момент.
Оглавления
Для удобства навигации есть посты с оглавлениями по темам:
Список всех постов по Django
Список всех постов по AIOgram3
Список всех постов по Docker
Список всех постов по Полезным инструментам
Чат
У канала есть чат. Присоединяйтесь!
Бот и сайт
У канала также есть бот с материалами к постам
И сайт(в процессе наполнения вышедшими постами)
Поддержка
Если вам нравится канал и выходящий материал, поделитесь ссылкой с людьми, кому это тоже может быть интересно.
👍2🔥2👏1
Приветствую.
Тема GPT и нейронок и не думает прекращаться. Кним присоединились и Яндекс со своим ЯндексGPT и Сбер со своим ГигаЧат. Вопрос. Интересно ли вам было бы увидеть пост-сравнение между ChatGPT, ЯндексGPT и ГигаЧатом? Накидаете тем в комменты?)
Тема GPT и нейронок и не думает прекращаться. Кним присоединились и Яндекс со своим ЯндексGPT и Сбер со своим ГигаЧат. Вопрос. Интересно ли вам было бы увидеть пост-сравнение между ChatGPT, ЯндексGPT и ГигаЧатом? Накидаете тем в комменты?)
Anonymous Poll
68%
Интересно!
14%
Ну его...
18%
(╯ ° □ °) ╯ (┻━┻) Да кто этот ваш GPT такой?
Оглавление для серии постов по Полезным инструментам
Для удобства навигации по предстоящим материалам, в данном посте будут публиковаться ссылки на сообщения.
Бесплатный CHAT-GPT4 на вашем сервере
Jazzmin - шаблон панели администратора Django
Certbot - бесплатный SSL-сертификат для сайта
Cpp FreeGPT WebUI - Бесплатный GPT на вашем сервере
Разворачивание Django-проекта на PythonAnyWhere
Разворачивание Django-проекта на Replit
Создание резервных копий VPS на Яндекс Диск
Веб-сервер Caddy - Альтернатива NGINX и Apache
#полезные_инструменты #оглавление
Для удобства навигации по предстоящим материалам, в данном посте будут публиковаться ссылки на сообщения.
Бесплатный CHAT-GPT4 на вашем сервере
Jazzmin - шаблон панели администратора Django
Certbot - бесплатный SSL-сертификат для сайта
Cpp FreeGPT WebUI - Бесплатный GPT на вашем сервере
Разворачивание Django-проекта на PythonAnyWhere
Разворачивание Django-проекта на Replit
Создание резервных копий VPS на Яндекс Диск
Веб-сервер Caddy - Альтернатива NGINX и Apache
#полезные_инструменты #оглавление
Полезные инструменты. Jazzmin - шаблон панели администратора Django
Панель администратора Django мне всегда казалась не совсем удобной. Не в плане функционала, а в плане её внешнего вида.
Да, они добавили смену цветовой темы, но сам интерфейс устарел.
В интернете есть множество готовых решений для кастомизации внешнего вида панели администратора Django. Я же вам расскажу о том как установить шаблон, который мне понравился -
Jazzmin.
Jazzmin - это современный, простой в использовании и настраиваемый шаблон для административной панели Django. Этот шаблон предлагает множество функций и настроек, чтобы сделать административную панель более удобной конкретно для вас.
Панель администратора Django мне всегда казалась не совсем удобной. Не в плане функционала, а в плане её внешнего вида.
Да, они добавили смену цветовой темы, но сам интерфейс устарел.
В интернете есть множество готовых решений для кастомизации внешнего вида панели администратора Django. Я же вам расскажу о том как установить шаблон, который мне понравился -
Jazzmin.Jazzmin.
Jazzmin - это современный, простой в использовании и настраиваемый шаблон для административной панели Django. Этот шаблон предлагает множество функций и настроек, чтобы сделать административную панель более удобной конкретно для вас.
Некоторые ключевые особенности Jazzmin:
1. Современный интерфейс: Jazzmin использует Bootstrap 4 и jQuery для создания современного и отзывчивого интерфейса.
2. Полная настройка: Jazzmin позволяет полностью настроить внешний вид административной панели. Вы можете изменить цвета, шрифты, логотипы и многое другое.
3. Улучшенная навигация: Jazzmin предлагает улучшенную навигацию с поиском по сайту, выпадающими меню и боковой панелью.
4. Интеграция с Django: Jazzmin полностью интегрирован с Django и поддерживает все его функции, включая авторизацию пользователей, управление контентом и т.д.
5. Мобильная адаптация: Jazzmin полностью адаптирован для мобильных устройств, что позволяет администраторам управлять сайтом с любого устройства.
Страница документации: https://django-jazzmin.readthedocs.io/
Установка.
Для установки выполним команду
Откроем файл
Будьте предельно внимательны!
Добавляем
На этом установка закончена и перейдя в панель администратора, вы увидите новый интерфейс.
Кастомизация.
Jazzmin поддерживает кастомизацию. Более подробно об этом, читайте в документации.
В своём проекте я практически ничего не стал менять.
Для того, чтобы внести изменения во внешний вид или функционал, в файле
-
-
Мои настройки:
-
-
-
Также доступна возможность интерактивно настроить интерфейс под себя и получить полный код
Для этого в
На этом всё. Пишите в комментариях, как вам данный модуль для Django, какую тему выбрали вы. Или может вы знаете другой, более удобный шаблон?
1. Современный интерфейс: Jazzmin использует Bootstrap 4 и jQuery для создания современного и отзывчивого интерфейса.
2. Полная настройка: Jazzmin позволяет полностью настроить внешний вид административной панели. Вы можете изменить цвета, шрифты, логотипы и многое другое.
3. Улучшенная навигация: Jazzmin предлагает улучшенную навигацию с поиском по сайту, выпадающими меню и боковой панелью.
4. Интеграция с Django: Jazzmin полностью интегрирован с Django и поддерживает все его функции, включая авторизацию пользователей, управление контентом и т.д.
5. Мобильная адаптация: Jazzmin полностью адаптирован для мобильных устройств, что позволяет администраторам управлять сайтом с любого устройства.
Страница документации: https://django-jazzmin.readthedocs.io/
Установка.
Для установки выполним команду
pip install django-jazzmin и добавим django-jazzmin==2.6.0 в requirements.txt.Откроем файл
settings.py и найдём INSTALLED_APPS.Будьте предельно внимательны!
Добавляем
jazzmin в самое начало списка. Строка jazzmin должна находиться над django.contrib.admin.На этом установка закончена и перейдя в панель администратора, вы увидите новый интерфейс.
Кастомизация.
Jazzmin поддерживает кастомизацию. Более подробно об этом, читайте в документации.
В своём проекте я практически ничего не стал менять.
Для того, чтобы внести изменения во внешний вид или функционал, в файле
settings.py есть два параметра:-
JAZZMIN_UI_TWEAKS - словарь, в котором прописываются изменённые элементы интерфейса.-
JAZZMIN_SETTINGS - словарь, в котором прописываются изменённые параметры конфигурации.Мои настройки:
# Админпанель
JAZZMIN_UI_TWEAKS = {
"theme": "darkly",
"sticky_actions": True,
"actions_sticky_top": True,
}
JAZZMIN_SETTINGS = {
"site_title": "Код на салфетке",
"site_brand": "Код на салфетке",
}
-
theme - задаёт Bootstrap шаблон. Выбрать понравившийся можно на сайте: https://bootswatch.com/-
sticky_actions и actions_sticky_top - делает так, что элементы управления, такие как сохранить, удалить, сохранить и добавить другой объект и так далее, сохраняют своё положение при скролле страницы.-
site_title и site_brand - задают заголовок и название сайта в админпанели.Также доступна возможность интерактивно настроить интерфейс под себя и получить полный код
JAZZMIN_UI_TWEAKS.Для этого в
JAZZMIN_SETTINGS необходимо добавить строку "show_ui_builder" = True.На этом всё. Пишите в комментариях, как вам данный модуль для Django, какую тему выбрали вы. Или может вы знаете другой, более удобный шаблон?
Приветствую.
Совместно с дизайнером проекта "Код на салфетке" запускаем Discord-сервер.
Сервер направлен в большую степень на дизайнеров, но и на программистов тоже.
Всем будем рады https://discord.gg/9baVxPma
Совместно с дизайнером проекта "Код на салфетке" запускаем Discord-сервер.
Сервер направлен в большую степень на дизайнеров, но и на программистов тоже.
Всем будем рады https://discord.gg/9baVxPma
🔥1
Django 25. Добавляем теги к постам
Теги являются важной частью любого информационного ресурса.
- Теги улучшают поисковую оптимизацию. Позволяют выделить ключевые слова в поиске.
- Фильтрация контента и создание связей на сайте. Пользователь сможет выбрать необходимый тег и посмотреть связанные с ним материалы.
django-taggit.
Для того чтобы добавить поддержку тегов в Django есть отличная библиотека
Установим библиотеку и добавим её в
И
Поле для тега.
Перейдём в файл
В нём добавим новое поле:
Применим миграции:
Теги являются важной частью любого информационного ресурса.
- Теги улучшают поисковую оптимизацию. Позволяют выделить ключевые слова в поиске.
- Фильтрация контента и создание связей на сайте. Пользователь сможет выбрать необходимый тег и посмотреть связанные с ним материалы.
django-taggit.
Для того чтобы добавить поддержку тегов в Django есть отличная библиотека
django-taggit.Установим библиотеку и добавим её в
requirements.txt:pip install django-taggit
И
taggit добавим в INSTALLED_APPS.Поле для тега.
Перейдём в файл
models.py и найдём класс поста PostModel.В нём добавим новое поле:
from taggit.managers import TaggableManager
tags = TaggableManager(blank=True)
Применим миграции:
python manage.py makemigrations
python manage.py migrate
Представление для тега.
Для вывода постов прикреплённых к тегу, сделаем новое представление и шаблон.
Перейдём в файл
В теле функции в переменную
Затем напишем контекст, содержащий имя тега и список постов.
И возвращаем рендер страницы.
Код функции:
Шаблон страницы тега.
Перейдём в директорию с шаблонами и создадим файл
Напишем простой шаблон (расширенный смотрите в материалах к посту):
В файле
И, чтобы страницы тегов заработали, перейдём в
Вот и всё, теперь у постов есть теги.
Файлы к посту, можно получить в https://t.iss.one/press_any_button_bot по коду: 772231
Для вывода постов прикреплённых к тегу, сделаем новое представление и шаблон.
Перейдём в файл
views.py и создадим новую функцию tag_page. Функция будет принимать в себя традиционный request и tag_name.В теле функции в переменную
posts получим отфильтрованные по имени тега посты.posts = models.PostModel.objects.filter(tags__slug=tag_name).distinct()
Затем напишем контекст, содержащий имя тега и список постов.
context = {
'tag_name': tag_name,
'posts': posts
}И возвращаем рендер страницы.
Код функции:
def tag_page(request, tag_name):
posts = models.PostModel.objects.filter(tags__slug=tag_name).distinct()
context = {
'tag_name': tag_name,
'posts': posts
}
return render(request,
'blog/tag_page.html',
context)
Шаблон страницы тега.
Перейдём в директорию с шаблонами и создадим файл
tag_page.html.Напишем простой шаблон (расширенный смотрите в материалах к посту):
{% extends "blog/base.html" %}
{% block title %}{{ tag_name | title }}{% endblock %}
{% block content %}
<div class="container">
<h1>{{ tag_name | title }}</h1>
<p>На этой странице представлены посты, отсортированные по имени тега {{ tag_name }}.</p>
<hr>
<div class="col-lg-9 col-sm-12 cat-block">
{% for post in posts %}
<div class="row">
<div class="col-lg-8 col-sm-12">
<h4><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4>
<p class="lead"><a href="{{ post.category.get_absolute_url }}">{{ post.category }}</a>
| {{ post.author }} | {{ post.publish | date:"d F Y" }}</p>
{% for tag in post.tags.all %}
<a href="{% url 'blog:tag_page' tag.slug %}"><span
class="badge bg-success">{{ tag.name }}</span></a>
{% endfor %}
</div>
</div>
<hr class="m-3">
{% endfor %}
</div>
</div>
{% endblock %}В файле
latest_posts.html и post_page.html добавим отображение тегов:{% for tag in post.tags.all %}
<a href="{% url 'blog:tag_page' tag.slug %}"><span class="badge bg-success">{{ tag.name }}</span></a>
{% endfor %}И, чтобы страницы тегов заработали, перейдём в
urls.py и добавим в паттерны сайта новую страницу. Используем регулярное выражение в качестве паттерна для поддержки тегов на кириллице: from django.urls import path, re_path
re_path(r'^tag/(?P<tag_name>[\w-]+)/$', views.tag_page, name='tag_page'),
Вот и всё, теперь у постов есть теги.
Файлы к посту, можно получить в https://t.iss.one/press_any_button_bot по коду: 772231
👍1
Приветствую.
На канале посты выходят раз в два-три дня, иногда будут чуть чаще, иногда чуть реже.
В это время канал простаивает и нет активности.
Хочу спросить у вас, какие бы вы хотели видеть активности на канале?
Тесты, опросы, вопросы, может совместное решение каких-то задач?
Предлагайте в комментариях.
Для меня важно, чтобы канал был полезен и интересен и чтобы помимо постов, вам было, что обсудить.
Спасибо.
На канале посты выходят раз в два-три дня, иногда будут чуть чаще, иногда чуть реже.
В это время канал простаивает и нет активности.
Хочу спросить у вас, какие бы вы хотели видеть активности на канале?
Тесты, опросы, вопросы, может совместное решение каких-то задач?
Предлагайте в комментариях.
Для меня важно, чтобы канал был полезен и интересен и чтобы помимо постов, вам было, что обсудить.
Спасибо.
🔥3
Давайте протестим викторины))
Что такое миграции в Django и для чего они используются?
Что такое миграции в Django и для чего они используются?
Anonymous Quiz
16%
Это способ создания резервной копии базы данных для безопасного хранения данных.
42%
Это автоматически создаваемые скрипты, которые изменяют структуру базы данных при развитии приложени
13%
Это функция, позволяющая перенести приложение на другой сервер без потери данных.
29%
Это способ управления версиями приложения и отслеживания изменений кода в системе контроля версий.
👍2
Django 26. Контекстные процессоры
На сайте есть блок ссылок, который отображается на страницах: категории, поста и главной. Все они передаются в шаблон в своём представлении. Это раздувает контекст представления лишними данными.
Было бы намного проще, если бы данные были доступны из всех шаблонов, где они задействованы, без раздувания контекста. Для этого в Django есть
Контекстные процессоры - это функции, которые позволяют добавлять определенные данные в контекст каждого шаблона. Они используются, когда нужно сделать некоторые данные доступными на всех страницах сайта.
На сайте есть блок ссылок, который отображается на страницах: категории, поста и главной. Все они передаются в шаблон в своём представлении. Это раздувает контекст представления лишними данными.
Было бы намного проще, если бы данные были доступны из всех шаблонов, где они задействованы, без раздувания контекста. Для этого в Django есть
контекстные процессоры.Контекстные процессоры - это функции, которые позволяют добавлять определенные данные в контекст каждого шаблона. Они используются, когда нужно сделать некоторые данные доступными на всех страницах сайта.
👍2
Создаём контекстный процессор.
В директории приложения создадим файл
Напишем простую функцию
В теле функции напишем возврат словаря, на подобии того, который представляет из себя контекст.
Ключом будет переменная, доступная в шаблоне, в моём случае это -
Код.
Добавляем процессор в settings.py.
Для того чтобы наш контекстный процессор начал работу, перейдём в файл
В этой переменной есть список
Сюда добавим нашу функцию:
Убираем лишнее из представлений.
Перейдём в файл
Проверка работы.
Запустим Django и убедимся, что блоки ссылок остались на своих местах.
Таким нехитрым образом можно передавать во все шаблоны статические, не изменяемые от действий пользователя, данные.
Файлы к посту, можно получить в боте по коду: 201532
В директории приложения создадим файл
context_processors.py.Напишем простую функцию
get_social_links которая принимает только request.В теле функции напишем возврат словаря, на подобии того, который представляет из себя контекст.
Ключом будет переменная, доступная в шаблоне, в моём случае это -
social_links, а значением получение всех объектов модели - models.SocialLinksModel.objects.all().Код.
from blog import models
def get_social_links(request):
return {'social_links': models.SocialLinksModel.objects.all()}
Добавляем процессор в settings.py.
Для того чтобы наш контекстный процессор начал работу, перейдём в файл
settings.py и найдём переменную TEMPLATES.В этой переменной есть список
context_processors.Сюда добавим нашу функцию:
'blog.context_processors.get_social_links',
Убираем лишнее из представлений.
Перейдём в файл
views.py и из всех представлений удалим передачу ссылок в шаблон.Проверка работы.
Запустим Django и убедимся, что блоки ссылок остались на своих местах.
Таким нехитрым образом можно передавать во все шаблоны статические, не изменяемые от действий пользователя, данные.
Файлы к посту, можно получить в боте по коду: 201532