尝试将get\u absolute\u url与自定义模板标记一起使用时出现NoReverseMatch

2024-04-20 02:05:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个日历应用程序,它有一个定制的模板标签,该标签采用python HTML模板函数,并在正确的日期覆盖事件模型中的对象。我正在尝试让显示的对象有一个直接链接到对象详细信息/编辑视图,并尝试使用get\u absolute\u url和反向渲染此视图。这是必要的,因为如果我试图通过for循环将每个事件的{% url %}模板标记硬编码到自定义模板标记中,则无法正确加载。我花了几个小时浏览了其他堆栈溢出问题,但运气不好,甚至还把我的反面改成了objectid,而不是事件的标题。我希望这只是一件小事,我忽略了,但不确定。你知道吗

查看:

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

网址:

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

很抱歉发布了大量代码。有没有人知道是什么导致了这个问题?你知道吗

提前谢谢!你知道吗


Tags: selfeventurldatereturnmydefbody
1条回答
网友
1楼 · 发布于 2024-04-20 02:05:10

这是由以下内容之间的输入错误/不匹配造成的:

url(r'^(?P<id>\d+)$/', views.viewEvent, name='viewevent'),

名称=viewevent

def get_absolute_url(self):
return reverse('cal:viewEvent', args=[str(self.id)],
current_app='cal')

名称=viewEvent

一旦这些都纠正了,它的工作很好。你知道吗

相关问题 更多 >