【发布时间】:2019-01-24 17:48:12
【问题描述】:
我有一个 rank.html,它是许多其他模板通过{% include rank.html %} 方法公开共享的模板。
此模板将根据点击数显示48小时热点新闻。
这里是view.py:
def rank(self, request):
hot_news_48h = h_mostViewed(48, News, '-pv')
return render(request, "rank.html", {
'hot_news_48h': hot_news_48h,})
h_mostViewed(48, News, '-pv') 是一个函数,可以在 48 小时内获取最多查看(点击)的帖子。它有效。
这是rank.html:
<ul>
{% for hot_view in hot_news_48h %}
<li>
<a href="{% url 'news:news_detail' hot_view.pk %}" >
<img src="{{ MEDIA_URL }}{{ hot_view.image }}" >
</a>
<a href="{% url 'news:news_detail' hot_view.pk %}">
<h6>{{ hot_view.title }}</h6>
</a>
</div>
</li>
{% endfor %}
</ul>
这里是 url.py:
path('hot_news', views.rank, name="hot_news")
问题是,我只能获取html,但无法接收数据。
但是如果我放弃 {% include rank.html %} 方法,将 rank.html 的代码直接插入每个需要此功能的模板中,我就可以获取数据。 以new_detail.html模板为例:
这里是view.py:
def newsDetailView(request, news_pk):
news = get_object_or_404(News, id=news_pk)
all_comments = NewsComments.objects.filter(news=news)
news.comment_nums = all_comments.count()
news.save()
News.objects.filter(id=news_pk).update(pv=F('pv') + 1)
hot_news_48h = h_mostViewed(48, News, '-pv')
relative_news = News.objects.filter(tag__id__in=news.tag.all()).exclude(id=news_pk)[:6]
return render(request, "news_detail.html", {
'news': news,
'all_comments': all_comments,
'hot_news_48h': hot_news_48h,
'relative_news': relative_news
})
这里是 urls.py:
path('-<int:news_pk>', views.newsDetailView, name="news_detail"),
所以上面,我直接把rank.html的代码插入到new_detail.html中,就可以得到数据了。
我的问题是我应该做什么或更正,以便我可以在 {% include rank.html %} 方法中获取数据。因为 {% include rank.html %} 简单灵活。我不想在几个相同的模板中重复相同的代码。
非常感谢您的耐心等待!
【问题讨论】:
-
您应该使用自定义模板标签 - 一个 inclusion tag,它使用所需的上下文呈现排名模板。
-
非常感谢您的回复。您能告诉我更多细节吗?
标签: python django django-templates django-views