尝试将get_absolute_url与自定义模板标记一起使用时的NoReverseMatch

时间:2017-03-28 17:46:22

标签: python django django-models django-urls

我正在创建一个日历应用程序,它具有自定义模板标记,该标记采用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', '&nbsp;')

    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')

对于发布的代码加载感到抱歉。任何人都知道有什么可能导致这个问题吗?

提前致谢!

1 个答案:

答案 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

一旦这些得到纠正,它就可以了。

相关问题