您好我是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> %}
。我的标签模板是好的,它调用标签函数的返回值:
答案 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的作用,以及为什么在实际请求数据之前它不与数据库进行交易。