Создание функциональности оповещения в django wagtail
Я пытаюсь создать раздел оповещения для меню (похожего на меню на этой странице https://metageeky.github.io/mega-menu/responsive-header.html)
* Каждое предупреждение должно иметь дату вступления в силу (дата "публикации" предупреждения в прямом эфире) и дату разрешения (дата "удаления" предупреждения в прямом эфире). Каждое оповещение также должно содержать максимум одно - два предложения текста с описанием ситуации. Количество активных/текущих предупреждений будет указано в круглых скобках после значка и текста ссылки ALERT.
Значок и текст темно-оранжевого цвета. При наведении курсора на значок и текст появляется подчеркивание.
Когда пользователи нажимают на ссылку, они попадают на страницу со списком всех активных оповещений. В нижней части страницы отображается сообщение "Если у вас возникла проблема, пожалуйста, свяжитесь с нами по адресу...."
Если нет предупреждений:
Количество предупреждений в скобках после пиктограммы и текста ссылки не будет отображаться.
И иконка, и текст предупреждения будут синего цвета.
Когда пользователи нажимают на ссылку, они попадают на страницу вторичных оповещений, где появляется сообщение: "В настоящее время нет активных оповещений. Если у вас возникла проблема, пожалуйста, свяжитесь с нами по адресу..."
Как мне этого достичь?
Спасибо.
В вашем вопросе есть что распаковать, но вот высокоуровневый подход.
1. Определите свою модель
- Прочитайте документацию Django о том, как создать
Model
.
- Прочитайте документацию Django о том, какие типы
Field
существуют .
- В вашем
models.py
вам нужно будет создать новую модель, которая будет содержать все данные, необходимые для ваших требований.
from django.db import models
class Alert(models.Model):
title = models.CharField()
description = models.TextField()
date_from = models.DateTimeField()
date_to = models.DateTimeField()
2. Убедитесь, что вы можете редактировать/управлять данными вашей модели
- Теперь вам необходимо предоставить пользователям-администраторам доступ к модели данных, редактировать и создавать элементы.
- Wagtail имеет отличную функцию Snippets, которая позволяет работать без особых изменений, вам нужно будет добавить
@register_snippet
на вашу модель, а также определить некоторыеpanels
.
from wagtail.admin.edit_handlers import FieldPanel
from wagtail.snippets.models import register_snippet
from django.db import models
@register_snippet
class Alert(models.Model):
#... fields (defined above)
panels = [
FieldPanel('title'),
FieldPanel('description'),
FieldPanel('date_from'),
FieldPanel('date_to'),
]
def __str__(self):
return self.title
3. Подготовьте тег шаблона для отображения запрошенных данных
- Теперь вам нужно разработать запрос к модели таким образом, чтобы он возвращал оповещения, основанные на ваших требованиях (текущая дата должна быть в диапазоне дат данных).
- В Django есть документация по написанию запросов .
- Самый простой способ получить результаты этого запроса в шаблоне - это пользовательский тег шаблона .
- Тег
inclusion_tag
- это способ иметь небольшой фрагмент шаблона, который можно использовать в любом месте с пользовательскими данными (без необходимости передавать их в каждый View). - В приведенном ниже примере вам все еще нужно будет создать файл шаблона
current_alerts.html
, который будет содержать то, как вы хотите отображать оповещения. - В вашем шаблоне тегов вы также можете использовать тег
page_url
для предоставления ссылки наalerts_page
.
# template_tags/custom_tags.py
# remember to create a template_tags/__init__.py file also
from django import template
from .models import Alert
register = template.Library()
@register.inclusion_tag('current_alerts.html')
def show_alerts():
# just returns all alerts, but this query can be refined to suit what you need
current_alerts = alerts.Objects.all()
alerts_page = AlertPage.Objects.all().first() # this assumes there will only ever be one
return {'alerts_page',alerts_page,'current_alerts': current_alerts}
4. Используйте тег шаблона & добавьте стилизацию
- Теперь вам нужно включить тег в верхней части страницы внутри вашего корневого/общего шаблона.
{% extends "base.html" %}
{% load custom_tags %}
{% block body_class %}template-blogpage{% endblock %}
{% show_alerts %}
{% block content %}...{% endblock %}
5. Создайте AlertsPage
- Вам нужно будет создать новый тип
Page
для перенаправления пользователей на вашу ссылку оповещения. - https://docs.wagtail.io/en/stable/topics/pages.html .
- Этот
Page
может быть в любом месте вашего дерева, а шаблон представленияPage
может также использовать тот же общий шаблон, или вы можете передать оповещения в представление через контекст шаблона .