如何在Django

时间:2018-08-17 16:26:09

标签: python django django-templates django-views

我有一个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%}既简单又灵活。我不想在几个相同的模板中重复相同的代码。

非常感谢您的耐心!

2 个答案:

答案 0 :(得分:1)

如何? -在您的应用程序中创建一个文件夹“ templatetags”,并添加一个文件“ news_tags.py”或根据需要命名。然后,您可以定义所需的标签:

from django.template import Library
from your_app.models import your_model

register = Library()

@register.inclusion_tag('your_app/your_template.html')
def hot_news(num, order):
    objects = News.objects.order_by(order)[:num]

    result['objects'] = objects

    return result

然后在模板中执行以下操作:

{% load news_tags %}
{% hot_news 48 '-pv' %}

然后像您已经创建的那样创建一个模板,并在包含标记中引用它。然后它应该可以正常工作。

如果您希望它适用于多种模型,可以查看以下内容:https://docs.djangoproject.com/el/2.1/ref/applications/ 应用程序框架允许您从字符串输入中获取模型。

答案 1 :(得分:0)

我终于通过创建自定义上下文处理器解决了该问题。https://www.youtube.com/watch?v=QTgkGBjjVYM