您的问题有很多要解开的内容,但这是一种高级方法。
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 有关于编写查询的文档
- 将此查询结果放入模板的最简单方法是使用自定义模板标签
- An
inclusion_tag
是一种拥有可以在任何地方使用自定义数据的小模板片段的方法(无需将其传递到每个视图中)。
- 在下面的示例中,您仍然需要创建模板文件,该文件
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