自定义模板标记查询集不返回任何内容

时间:2016-04-07 09:52:00

标签: django django-models django-templates django-views

我正在尝试实现一个显示最近创建的5个事件的功能。我决定用Django自定义模板标签来实现它(如果这不是最好的方法,请告诉我)。到目前为止我所拥有的是:

在event_search.html(以及其他内容)中:

{% extends 'base.html' %}
{% load eventSearch_extras %}
<p>count: {{ recents.count }}</p>
<ul>
{% for e in recents %}
    <li> {{e.title}} </li>
{% empty %}
    <li> No recent events </li>
{% endfor %}
</ul>

在eventSearch_extra.py中:

from django import template
from eventSearch.models import Event

register = template.Library()

@register.inclusion_tag('eventSearch/event_search.html')
def mostrecentevents():
    """Returns most 5 most recent events"""
    recents = Event.objects.order_by('-created_time')[:5]
    return {'recents': recents}

我的问题是查询集&#39; recents&#39;似乎返回空模板。 &#39;计算:&#39;没有显示任何内容for-loop默认为“No no events&#39;。

。”

2 个答案:

答案 0 :(得分:3)

inclusion tag用于呈现另一个模板。创建一个呈现event_search.html的包含标记,然后在event_search.html内部调用该模板标记是没有意义的。请注意,您实际上没有使用模板标记(使用{% mostrecentevents %}),您所做的就是加载模板标记库。

使用simple tag会更容易。

@register.simple_tag
def mostrecentevents():
    """Returns most 5 most recent events"""
    recents = Event.objects.order_by('-created_time')[:5]
    return recents

然后在你的模板中你可以这样做:

{% load eventSearch_extras %}
{% mostrecentevents as recents %}

这会将模板标记的结果加载到变量recents中,您现在可以执行以下操作:

<p>count: {{ recents.count }}</p>
<ul>
{% for e in recents %}
    <li> {{e.title}} </li>
{% empty %}
    <li> No recent events </li>
{% endfor %}
</ul>

请注意,您只能将as recents语法与Django 1.9+的简单标记一起使用。对于早期版本,您可以使用assignment tag代替。

答案 1 :(得分:2)

您已加载inclusion tag function,但未加载单个标记,因此永远不会调用填充该信息的代码;它也略显奇怪,所以你从错误的地方打电话。

主模板使用:

调用包含标记
{% load eventSearch_extras %}

您可以通过调用

来包含实际标记
{{mostrecentevents}} 

mostrecentevents关闭并运行代码,解析event_search.html的html并将其放入主模板中。您刚才开始编写代码的方式,您可以从自己的HTML中调用包含标记。

主模板&gt; {% load inclusion_tags %} {{ actual_tag }}

举个例子,我有一个餐厅模板。在该模板中是这段代码:

{% load restaurant_menu %}  <!--main inclusion tag .py file) --> 
{% menu %}  <!-- the actual tag code you want to run --> 
在restaurant_menu.py中的

我有以下内容(删除了其他不相关的内容):

@register.inclusion_tag('core/_menu.html', takes_context=True)
def menu(context):
    filtered =  context['filtered']
    from core.models import MenuItem, FoodProfile, Ingredient, Recipe
    if filtered:
        restaurant = context['restaurant'].id
        filtered_menu = #stuff here 
        restaurant_menu = filtered_menu
    else:
        restaurant_menu = MenuItem.objects.filter(restaurant__pk=context['restaurant'].id)
    return {"restaurant_menu": restaurant_menu,
            "number_of_menu_items": restaurant_menu.count(),
            "filtered": filtered}

和_menu.html页面(强调所以我知道它是一个片段):

<ul>
    {% for item in course.list %}
        <li>
{{ item.number|floatformat:0 }}  {{ item.name }} {{ item.description }} {{ item.price  }} </li>
</li>{% endfor %}
{% endfor %}
</ul>