2016-04-07 2 views
1

Я пытаюсь реализовать функцию, которая отображает 5 последних созданных событий. Я решил реализовать это с помощью специальных шаблонов шаблонов Django (если это не лучший способ, дайте мне знать). То, что я до сих пор:Пользовательский шаблонный тэг Queryset, не возвращающий ничего

В 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} 

Моя проблема здесь в том, что QuerySet 'Недавних' похоже, возвращает пустой шаблон. «count:» ничего не отображает. & По умолчанию для цикла «Нет недавних событий».

+0

Это выглядит как чрезвычайно сложный способ делать вещи ... вы просто пытаетесь показать эти «ретентаты» на каждой странице? – Sayse

+0

Нет, просто страница поиска. Каков наилучший способ? – user1846359

+1

Просто включите их в контекстные данные просмотра страниц поиска? Я не уверен, что здесь что-то не хватает. – Sayse

ответ

2

Вы загрузили inclusion tag function,, но не отдельный тег, поэтому код для заполнения этой информации никогда не вызывается; это также немного странно, так что вы звоните из-за неправильного места.

Основной шаблон вызывает включение метки с помощью:

{% load eventSearch_extras %} 

И вы включаете фактический тег по телефону

{{mostrecentevents}} 

mostrecentevents уходит и запускает код, разбирает HTML из event_search. html и помещает его в основной шаблон. Как только ваш код будет указан сейчас, вы будете называть тег включения из собственного HTML.

Главная шаблон>{% 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> 
3

An 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.

+0

Ты потрясающий! это спасло мои часы. Но я не видел этого в документе django, где вы его видели? Большое спасибо .. –

+0

@ BurakÖztürk Я не уверен, что вы ищете для ссылок ... ответ уже ссылается на документы Django несколько раз. – Alasdair

+0

Я проверяю этот документ https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/#django.template.Library.simple_tag –

Смежные вопросы