如何通过两个不同的视图将不同的数据呈现到同一页面 - Django
How to render different data to the same page by two different views - Django
我正在建一个新闻website.I 需要显示48 小时内观看次数最多的新闻,这部分在detail.html 页面中。现在我正在使用这个方法。
def newsDetailView(request, news_pk):
news = get_object_or_404(News, id=news_pk)
News.objects.filter(id=news_pk).update(pv=F('pv') + 1)
time_period = datetime.now() - timedelta(hours=48)
host_news=news.objects.filter(date_created__gte=time_period).order_by('-pv')[:7]
return render(request, "news_detail.html", {
'news': news,
'host_news' : host_news
})
它工作得很好,但我的问题是,为了方便使用缓存,我想将 hot_news 函数与 def newsDetailView.[=17 分开=]
我试过了:
def hot_news(request):
time_period = datetime.now() - timedelta(hours=48)
hot_news =News.objects.filter(add_time__gt=time_period).order_by('-pv')[:7]
return render(request, "news_detail.html", {
'most_viewedh': most_viewedh
})
但是我无法在 detail.html
中获取数据。我想这个问题是因为 url.
来自 index.html
的 detail.html
的 link 是
<a href="{% url 'news:news_detail' news.pk %}">
news:news_detail
是视图 def newsDetailView
的 url
所以 url 直接指向 def newsDetailView,与 def hot_news 没有任何关系。
我应该怎么做,才能将 def hot_news 中的数据渲染到与 def newsDetailView[=39= 相同的页面] 呢?
所以您说得对,因为您要访问的 url 是 'news:news_detail'
,这是唯一加载的视图。如果您确实想从另一个视图加载数据,您可以使用 ajax 只加载 hot_news 数据并将其插入到页面中。
尽管如果您想要实现的只是 hot_news 的缓存,则这不是必需的。您可以像这样使用 Django 的低级缓存 api:
from django.core.cache import cache
def newsDetailView(request, news_pk):
news = get_object_or_404(News, id=news_pk)
News.objects.filter(id=news_pk).update(pv=F('pv') + 1)
# Get host_news from the cache
host_news = cache.get('host_news')
# If it was not in the cache, calculate it and set cache value
if not host_news:
time_period = datetime.now() - timedelta(hours=48)
host_news=news.objects.filter(date_created__gte=time_period).order_by('pv')[:7]
# Sets the cache key host_news with a timeout of 3600 seconds (1 hour)
cache.set('host_news', host_news, 3600)
return render(request, "news_detail.html", {
'news': news,
'host_news' : host_news
})
有关低级缓存 api 的文档在此处:https://docs.djangoproject.com/en/2.0/topics/cache/#the-low-level-cache-api
您可能还需要查看 settings.py 中的 CACHES 设置,如果您还没有这样做的话
我正在建一个新闻website.I 需要显示48 小时内观看次数最多的新闻,这部分在detail.html 页面中。现在我正在使用这个方法。
def newsDetailView(request, news_pk):
news = get_object_or_404(News, id=news_pk)
News.objects.filter(id=news_pk).update(pv=F('pv') + 1)
time_period = datetime.now() - timedelta(hours=48)
host_news=news.objects.filter(date_created__gte=time_period).order_by('-pv')[:7]
return render(request, "news_detail.html", {
'news': news,
'host_news' : host_news
})
它工作得很好,但我的问题是,为了方便使用缓存,我想将 hot_news 函数与 def newsDetailView.[=17 分开=]
我试过了:
def hot_news(request):
time_period = datetime.now() - timedelta(hours=48)
hot_news =News.objects.filter(add_time__gt=time_period).order_by('-pv')[:7]
return render(request, "news_detail.html", {
'most_viewedh': most_viewedh
})
但是我无法在 detail.html
中获取数据。我想这个问题是因为 url.
来自 index.html
的 detail.html
的 link 是
<a href="{% url 'news:news_detail' news.pk %}">
news:news_detail
是视图 def newsDetailView
所以 url 直接指向 def newsDetailView,与 def hot_news 没有任何关系。
我应该怎么做,才能将 def hot_news 中的数据渲染到与 def newsDetailView[=39= 相同的页面] 呢?
所以您说得对,因为您要访问的 url 是 'news:news_detail'
,这是唯一加载的视图。如果您确实想从另一个视图加载数据,您可以使用 ajax 只加载 hot_news 数据并将其插入到页面中。
尽管如果您想要实现的只是 hot_news 的缓存,则这不是必需的。您可以像这样使用 Django 的低级缓存 api:
from django.core.cache import cache
def newsDetailView(request, news_pk):
news = get_object_or_404(News, id=news_pk)
News.objects.filter(id=news_pk).update(pv=F('pv') + 1)
# Get host_news from the cache
host_news = cache.get('host_news')
# If it was not in the cache, calculate it and set cache value
if not host_news:
time_period = datetime.now() - timedelta(hours=48)
host_news=news.objects.filter(date_created__gte=time_period).order_by('pv')[:7]
# Sets the cache key host_news with a timeout of 3600 seconds (1 hour)
cache.set('host_news', host_news, 3600)
return render(request, "news_detail.html", {
'news': news,
'host_news' : host_news
})
有关低级缓存 api 的文档在此处:https://docs.djangoproject.com/en/2.0/topics/cache/#the-low-level-cache-api
您可能还需要查看 settings.py 中的 CACHES 设置,如果您还没有这样做的话