【问题标题】:How to render data to a {% included a.html %} template in Django如何将数据呈现到 Django 中的 {% included a.html %} 模板
【发布时间】: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


【解决方案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/ 应用程序框架允许您从字符串输入中获取模型。

【讨论】:

  • 非常感谢!看起来很高级的方法。我去学习试试。
  • 你好朋友你能帮我解决这个问题stackoverflow.com/questions/52159365/… 吗?
  • 非常感谢,现在我正在做另一个项目,终于发现这是最好的方法!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 2019-10-27
    • 2019-11-29
    • 2021-06-11
    • 2012-12-11
    • 1970-01-01
    • 2017-11-08
    • 2012-11-28
    相关资源
    最近更新 更多