Django, как визуализировать пользовательский тег шаблона внутри тега включения для отображения его в base.html - PullRequest
1 голос
/ 05 ноября 2010

Здравствуйте, я начинающий в Django.

У меня есть календарь, который я хочу отображать на каждом сайте моей веб-страницы, поэтому я называю это {% include "tags/my_calendar.html" %} в моем base.html.

Насколько я знаю, я могу либо отобразить календарь, создав собственный тег шаблона, либо использовать его в стандартном представлении Django. Я протестировал его в стандартном представлении Django, вызвав функцию календаря через urls.py, который работает нормально. Но я не хочу, чтобы календарь отображался только для специального URL.

Так что я могу сделать это, определив пользовательский тег шаблона?

Я пробовал это до сих пор:

from django import template
register = template.Library()
@register.inclusion_tag("tags/my_calendar.html")
def calendar():
"""
Show calendar of events for specified month and year
"""
  lToday = datetime.now()
  lYear = lToday.year
  lMonth = lToday.month
  my_workouts = ContestEvent.objects.filter(id__year=lYear, id__month=lMonth)
  lCalendar = WorkoutCalendar(my_workouts).formatmonth(lYear, lMonth)
  return {'calendar':  mark_safe(lCalendar)} 

Я переопределяю класс HTMLCalender следующим образом, и все это работает со стандартным представлением Django, как упомянуто выше, но возвращает render_to_response:

class WorkoutCalendar(HTMLCalendar):

    def __init__(self, workouts):
        super(WorkoutCalendar, self).__init__()
        # self.workouts = self.group_by_day(workouts)

    def formatday(self, day, weekday):
        if day != 0:
            cssclass = self.cssclasses[weekday]
            if date.today() == date(self.year, self.month, day):
                cssclass += ' today'
            return self.day_cell(cssclass, day)
        return self.day_cell('noday', ' ')

    def formatmonth(self, year, month):
        self.year, self.month = year, month
        return super(WorkoutCalendar, self).formatmonth(year, month)

    def day_cell(self, cssclass, body):
        return '<td class="%s">%s</td>' % (cssclass, body)

Мой \ tags \ my_calendar.html выглядит так:

{% load calendar_tag %}
<div>
{% calendar %}
</div

Что я делаю по существу неправильно? Я получил следующую ошибку:

Request Method:     GET
Request URL:    http://127.0.0.1:8000/de/
Exception Type:     TemplateSyntaxError
Exception Value:    

Caught an exception while rendering: maximum recursion depth exceeded  

update1 С подсказкой Daniel Roseman , чтобы использовать переменный синтаксис {{ calendar }} вместо синтаксиса тега {% calendar %} Я избавился от ошибки рекурсии, но мой календарь все еще не отображается. Я провожу много расследований.

Что здесь не так?

Update2 после некоторого исследования я нашел это краткое описание о том, как использовать пользовательский тег шаблона. Ошибка, из-за которой календарь не появился, состояла в том, что я вызывал {% include "tags/my_calendar.html" %} в base.html вместо вызова функции моего тега как {% calendar <parameter> %}. Принимая во внимание, что мой шаблон тега был в порядке, что вызывает возвращаемое значение функции тега:

{{calendar}}

Ответы [ 2 ]

1 голос
/ 05 ноября 2010

Ваша ошибка рекурсии заключается в том, что вы вызываете тег calendar внутри шаблона, отображаемого этим же тегом.

Ваш файл /tags/my_calendar.html должен фактически выглядеть следующим образом:

<div>
{{ calendar }}
</div>

Обратите внимание на использование синтаксиса переменной, чтобы показать, что вы отображаете значение, переданное в контекст, а не синтаксис тега.Вам также не нужно использовать load.

0 голосов
/ 05 ноября 2010

Если календарь будет отображаться на каждой странице вашего сайта, то имеет смысл создать контроллер календаря в context_processor. Таким образом, поля добавляются в объект Request, который доступен для каждого шаблона, а затем просто встраивают представление календаря в базовый шаблон.

Джеймс Беннет четко описывает это: http://www.b -list.org / weblog / 2006 / jun / 14 / django-tips-template-context-processors /

Если вы прикрепите вызов к календарю как объект замыкания или функтора, кстати, вы сможете избежать затрат на транзакции на тех страницах, где вы его не отображаете. Это то, что делает QuerySet и почему он не взаимодействует с базой данных, пока данные фактически не запрашиваются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...