在设定的日期和时间发布自定义 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 协议;这暂时对我有用。如果有更优雅的解决方案,请告诉我。
我有一个自定义的 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 协议;这暂时对我有用。如果有更优雅的解决方案,请告诉我。