Объединение двух запросов в тег шаблона

У меня две модели news.article и portfolio.entry. Обе модели имеют BooleanField для установки «is_campaign» в true.

Я пытаюсь написать собственный шаблонный шаблон, чтобы я мог получить последнюю статью кампании (там должно быть только одно)

Вот мой templatetag: campaign_article.py

from itertools import chain from django import template from news.models import Article from portfolio.models import Entry register = template.Library() def get_campaign(): #Get the newest news article with is_campaign=True article = Article.objects.filter(is_campaign=True).order_by('-pub_date')[:1] #Get the newest portfolio entry with is_campaign=True portfolio = Portfolio_entry.objects.filter(is_campaign=True).order_by('-pub_date')[:1] #combine article, and entry and display only the newest campaign_article = list(chain(article, portfolio))[:1] return {'campaign_article': campaign_article} register.tag('campaign', get_campaign) 

Я пробовал это в своем шаблоне:

 {% load campaign_article %} {% for campaign_article in campaign %} {{ campaign_article.id }} {% endfor %} 

Но я ничего не получаю. Это неправильный метод?

2 Solutions collect form web for “Объединение двух запросов в тег шаблона”

Вы бы хотели создать assignment_tag а не общий тег. Таким образом, вы можете обновить свой тег следующим образом:

 def get_campaign(): #your stuff .... return campaign_article register.assignment_tag(get_campaign, name='campaign') 

И обновите шаблон как:

 {% load campaign_article %} {% campaign as campaign_list %} {# loads the tags and creates campaign_list context variable #} {% for campaign_article in campaign_list %} {{ campaign_article.id }} {% endfor %} 

Вам не нужно создавать тег шаблона, чтобы делать то, что вы хотите. Читайте о процессоре контекста :

 def get_campaign(request): # this is your context processor # ... return {'campaign_article': campaign_article} 

На ваш взгляд:

 def some_view(request): # ... c = RequestContext(request, { 'foo': 'bar', }, [get_campaign]) # attach your context processor to template context return HttpResponse(t.render(c)) 

UPD: если вам нужно отобразить данные на каждой странице, вы можете зарегистрировать свой процессор контекста как глобальный в своем файле настроек. См. Настройки шаблонов контекстных шаблонов .

 TEMPLATE_CONTEXT_PROCESSORS = (..., "myapp.context_processors.get_campaign") 

Django автоматически добавит переменную campaign_article к каждому рендерингу шаблонов.

  • Список содержимого каталога каталога в шаблоне Django
  • Вызывать средство визуализации Django в памяти без каких-либо файлов из строк?
  • Как заставить STATIC_URL работать во внешних JS-файлах (Django)
  • не может быть выполнено, если условие с переменной django и переменной javascript
  • Добавьте динамическую форму в набор форм django, используя javascript правильно
  • Что эквивалентно «none» в шаблонах django?
  • request.user в Django
  • Django: проанализируйте JSON в моем шаблоне, используя Javascript
  • Python - лучший язык программирования в мире.