Создание функциональности оповещения в django wagtail

Я пытаюсь создать раздел оповещения для меню (похожего на меню на этой странице https://metageeky.github.io/mega-menu/responsive-header.html)

* Каждое предупреждение должно иметь дату вступления в силу (дата "публикации" предупреждения в прямом эфире) и дату разрешения (дата "удаления" предупреждения в прямом эфире). Каждое оповещение также должно содержать максимум одно - два предложения текста с описанием ситуации. Количество активных/текущих предупреждений будет указано в круглых скобках после значка и текста ссылки ALERT.

Значок и текст темно-оранжевого цвета. При наведении курсора на значок и текст появляется подчеркивание.

Когда пользователи нажимают на ссылку, они попадают на страницу со списком всех активных оповещений. В нижней части страницы отображается сообщение "Если у вас возникла проблема, пожалуйста, свяжитесь с нами по адресу...."

Если нет предупреждений:

Количество предупреждений в скобках после пиктограммы и текста ссылки не будет отображаться.

И иконка, и текст предупреждения будут синего цвета.

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

Как мне этого достичь?

Спасибо.

В вашем вопросе есть что распаковать, но вот высокоуровневый подход.

1. Определите свою модель

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 может также использовать тот же общий шаблон, или вы можете передать оповещения в представление через контекст шаблона
  • .
Вернуться на верх