我正在尝试实现一个显示最近创建的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;。
。”答案 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>