在设定的日期和时间发布自定义 Django Flatpage

Publish a custom Django Flatpage at a set date and time

我有一个自定义的 Flatpage 模型:

from django.contrib.flatpages.models import FlatPage

class MyFlatPage(FlatPage):

    publish = models.DateTimeField()

以便我以后可以添加发布日期。

现在,我没有合适的前端平面列表,我对首页的使用更像是 'one-offs',我在其中指定了 URL 等等。例如,'about'、'2019prize'、'今天的步行',诸如此类。

urls.py 设置为捕获所有平面页面:

from django.contrib.flatpages import views
re_path(r'^(?P<url>.*/)$', views.flatpage)

如何将我创建的这些页面设置为仅在 publish 日期到来后显示?我知道我可以通过查找类似 pages.filter(publish__lte=now) 的内容来过滤它们。我应该在哪里以及如何放置该代码?

附加信息

我想我需要创建一个自定义视图,对吗?原图在../lib/python3.8/site-packages/django/contrib/flatpages/views.py:

def flatpage(request, url)
    if not url.startswith('/'):
        url = '/' + url
    site_id = get_current_site(request).id
    try:
        f = get_object_or_404(FlatPage, url=url, sites=site_id)
    except Http404:
        if not url.endswith('/') and settings.APPEND_SLASH:
            url += '/'
            f = get_object_or_404(FlatPage, url=url, sites=site_id)
            return HttpResponsePermanentRedirect('%s/' % request.path)
        else:
            raise
    return render_flatpage(request, f)

@csrf_protect
def render_flatpage(request, f):

    if f.registration_required and not request.user.is_authenticated:
        from django.contrib.auth.views import redirect_to_login
        return redirect_to_login(request.path)
    if f.template_name:
        template = loader.select_template((f.template_name, DEFAULT_TEMPLATE))
    else:
        template = loader.get_template(DEFAULT_TEMPLATE)

    f.title = mark_safe(f.title)
    f.content = mark_safe(f.content)

    return HttpResponse(template.render({'flatpage': f}, request))

我如何扩展它,添加我的 if publish__lte=now 代码?

我所做的是将视图代码从 ../lib/python3.8/site-packages/django/contrib/flatpages/views.py 复制粘贴到我的 app.views,重命名这两个函数,并将以下内容添加到 render_myflatpage:

def render_myflatpage(request, f):
[...]

    if f.publish > now:
        f.content = 'This content will be published on ' + str(f.publish)

然后我在包罗万象的 urls.py 代码中分配了新视图:

    re_path(r'^(?P<url>.*/)$', myflatpage)

我知道这违反了 DRY 协议;这暂时对我有用。如果有更优雅的解决方案,请告诉我。