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

Publish a custom Django Flatpage at a set date and time

提问人:HBMCS 提问时间:6/23/2021 最后编辑:HBMCS 更新时间:6/23/2021 访问量:117

问:

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

from django.contrib.flatpages.models import FlatPage

class MyFlatPage(FlatPage):

    publish = models.DateTimeField()

这样我就可以在将来添加发布日期。

现在,我在前端没有适当的平面页面列表,我对首页的使用更像是“一次性”,我在其中指定了 URL 等等。例如,“关于”、“2019prize”、“今天的散步”等。

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

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

如何将我创建的这些页面设置为仅在日期到来后显示?我知道我可以通过查找类似 .但是,我应该在哪里以及如何放置该代码?publishpages.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

django django 模型 django 简单页面

评论


答:

0赞 HBMCS 6/23/2021 #1

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

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

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

然后,我在 catch-all 代码中分配了新视图:urls.py

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

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