【问题标题】:NoReverseMatch when trying to use get_absolute_url with custom template tag尝试将 get_absolute_url 与自定义模板标签一起使用时的 NoReverseMatch
【发布时间】:2023-03-09 18:26:01
【问题描述】:

我正在制作一个日历应用程序,它有一个自定义模板标签,它采用 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))

网址:

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

对于发布的大量代码感到抱歉。有没有人知道可能导致此问题的原因?

提前致谢!

【问题讨论】:

    标签: python django django-models django-urls


    【解决方案1】:

    这是由以下内容之间的拼写错误/不匹配引起的:

    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

    一旦这些被纠正,它就可以正常工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      相关资源
      最近更新 更多