【问题标题】:Publish a custom Django Flatpage at a set date and time在设定的日期和时间发布自定义 Django Flatpage
【发布时间】:2021-09-06 23:12:00
【问题描述】:

我有一个自定义的平面模型:

from django.contrib.flatpages.models import FlatPage

class MyFlatPage(FlatPage):

    publish = models.DateTimeField()

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

现在,我在前端没有适当的平面页面列表,我对前端页面的使用更像是“一次性”,我在其中指定了 URL 和所有这些。例如,“about”、“2019prize”、“Today's walk”之类的。

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 代码?

【问题讨论】:

    标签: django django-models django-flatpages


    【解决方案1】:

    我所做的是将视图代码从../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 协议;这暂时对我有用。如果有更优雅的解决方案,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多