Как визуализировать разные данные на одной странице с помощью двух разных представлений - Django - PullRequest
0 голосов
/ 19 мая 2018

Я создаю новостной сайт. Мне нужно отобразить 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 .

Я пытался:

 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.

ссылка detail.html из index.html равна

 <a href="{% url 'news:news_detail' news.pk %}">

news:news_detail - это URL представления def newsDetailView

Таким образом, URL-адрес находится прямо на def newsDetailView и не имеет ничего общего с def hot_news .

Что мне делать, поэтомучто я могу отобразить данные из def hot_news на ту же страницу, что и def newsDetailView делает?

1 Ответ

0 голосов
/ 19 мая 2018

Итак, вы правы, говоря, что URL-адрес, по которому вы идете, - 'news:news_detail', это единственный загруженный вид.Если вы действительно хотите загрузить данные из другого представления, вы можете использовать ajax для загрузки только данных hot_news и вставить их на страницу.

Хотя, если все, чего вы хотите добиться - это кэширование hot_news, это не требуется.Вместо этого вы могли бы использовать низкоуровневый API кеша django следующим образом:

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

Возможно, вам также придется взглянуть на настройкиCACHES в вашем settings.py, если вы еще этого не сделали

...