我正在创建一个日历应用程序,它具有自定义模板标记,该标记采用python HTML模板功能,并在正确的日期覆盖事件模型中的对象。我试图让显示的对象直接链接到对象详细信息/编辑视图,并尝试使用get_absolute_url并反向渲染此视图。这是必要的,因为如果我尝试通过for循环将{% url %}
模板标记硬编码到每个事件中,则自定义模板标记无法正确加载。我花了几个小时来查看其他堆栈溢出问题,没有运气,甚至改变了我的反向对象ID而不是事件的标题。我希望这只是一件小事,我忽略了但不确定。
视图:
def home(request, month=None, year=None):
if month == None:
_date = datetime.now()
else:
_date = date(int(year), int(month), 1)
title = "%s, %s" % (_date.strftime("%B"), _date.strftime("%Y"))
return render(request, 'calendar.html', calendar(_date, title))
URL:
app_name = 'cal'
urlpatterns = [
url(r'^$', views.home, name='home'),
url(r'^newevent/$', views.newEvent, name='newevent'),
url(r'^(?P<id>\d+)$/', views.viewEvent, name='viewevent'),
url(r'^(?P<month>\d+)/(?P<year>\d+)$', views.home, name='another-month')
]
HTML:
<div>
{% load calendarify %}
<span id="calendarify">{% calendarify year month event_list %}</span>
</div>
模板标签:
def do_month_calendarify(parser, token):
# Take the tag input from the template and format
# Template syntax is {% calendarify year month %}
try:
tag_name, year, month, event_list = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError(
"%r tag requires three arguments" % token.contents.split()[0]
)
return CalendarifyNode(year, month, event_list)
class CalendarifyNode(template.Node):
def __init__(self, year, month, event_list):
try:
self.year = template.Variable(year)
self.month = template.Variable(month)
self.event_list = template.Variable(event_list)
except ValueError:
raise template.TemplateSyntaxError
def render(self, context):
try:
my_year = self.year.resolve(context)
my_month = self.month.resolve(context)
my_event_list = self.event_list.resolve(context)
cal = EventCalendar(my_event_list)
return cal.formatmonth(
int(my_year), int(my_month))
except ValueError:
return "%s, %s, %s" % (my_month, my_year, my_event_list)
class EventCalendar(HTMLCalendar):
# Use Python's HTMLCalendar and put user events over top
def __init__(self, events):
super(EventCalendar, self).__init__()
self.events = self.group_by_day(events)
def formatday(self, day, weekday):
if day != 0:
cssid = self.cssclasses[weekday]
cssclass = "daybox"
if date.today() == date(self.year, self.month, day):
cssid += ' today'
if day in self.events:
cssid += ' filled'
body = ['<ul>']
for event in self.events[day]:
body.append('<li>')
body.append('<a href="%s">' % event.get_absolute_url())
body.append(esc(event.title))
body.append('</a></li>')
body.append('</ul>')
return self.day_cell(
cssclass, cssid, '<span class="dayNumber">%d</span> %s' % (
day, ''.join(body)))
return self.day_cell(
cssclass, cssid, '<span class="dayNumberNoReadings">%d</span>' % (day))
return self.day_cell('nodaybox', 'noday', ' ')
def formatmonth(self, year, month):
self.year, self.month = year, month
return super(EventCalendar, self).formatmonth(year, month)
def group_by_day(self, events):
field = lambda event: event.start_date.day
return dict(
[(day, list(items)) for day, items in groupby(events, field)]
)
def day_cell(self, cssclass, cssid, body):
return '<td class="%s" id="%s">%s</td>' % (cssclass, cssid, body)
register.tag('calendarify', do_month_calendarify)
型号:
class Events(models.Model):
...
def get_absolute_url(self):
return reverse('cal:viewEvent', args=[str(self.id)], current_app='cal')
对于发布的代码加载感到抱歉。任何人都知道有什么可能导致这个问题吗?
提前致谢!
答案 0 :(得分:0)
这是由于以下内容之间的拼写错误/不匹配造成的:
url(r'^(?P<id>\d+)$/', views.viewEvent, name='viewevent'),
name = viewevent
def get_absolute_url(self):
return reverse('cal:viewEvent', args=[str(self.id)],
current_app='cal')
name = viewEvent
一旦这些得到纠正,它就可以了。