Django如何在inclusion_tag中呈现自定义模板标记,以便在base.html中显示它

时间:2010-11-05 15:55:26

标签: django templates calendar django-templates

您好我是Django初学者。

我有一个日历,我希望在我的网页的每个网站上显示,所以我在base.html中调用此{% include "tags/my_calendar.html" %}

据我所知,到目前为止,我可以通过创建自定义模板标记或在标准Django视图中使用它来显示日历。我通过标准的Django视图测试它,通过urls.py调用日历函数,这很好。 但我不希望日历只显示特殊网址。

我可以通过定义自定义模板标记来做到这一点吗?

到目前为止我试过这个:

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 经过一些调查,我发现这个有用的短description有关如何使用自定义模板标签的帮助。 日历没有出现的错误是我在base.html中调用{% include "tags/my_calendar.html" %},而不是将我的标记功能称为{% calendar <parameter> %}。我的标签模板是好的,它调用标签函数的返回值:

  {{calendar}}

2 个答案:

答案 0 :(得分:1)

您的递归错误是因为您正在调用由同一个标记呈现的模板中的calendar标记。

您的/tags/my_calendar.html文件实际上应如下所示:

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

请注意使用变量语法,以显示您正在渲染传递给上下文的值,而不是标记语法。您也不需要使用load

答案 1 :(得分:0)

如果要在您网站的每个页面中显示日历,那么在context_processor中创建日历的控制器会更有意义。这样,字段就会添加到每个模板都可用的Request对象中,然后只需将日历视图嵌入到基本模板中。

James Bennet清楚地描述了这一点:http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

如果您将日历的调用作为闭包或仿函数对象附加,顺便说一句,您可以避免在不呈现它的页面上的交易成本。这就是QuerySet的作用,以及为什么在实际请求数据之前它不与数据库进行交易。