django 应用程序中的 url 中的 NoReverseMatch

Posted

技术标签:

【中文标题】django 应用程序中的 url 中的 NoReverseMatch【英文标题】:NoReverseMatch in url in django app 【发布时间】:2017-03-21 19:49:55 【问题描述】:

我有 url,这一切都应该没问题,但我得到一个错误。

这是我的网址:

url(r'^/(?P<genre>%s)$' % '|'.join([g.code for g in Genre.objects.all()]), EventListView.as_view(), name='genre'),

这里是错误信息:

Reverse for 'genre' with arguments '()' and keyword arguments 'u'genre': ''' not found. 0 pattern(s) tried: []

在这行html代码中:

<a % if genre == view.genre % class="active" href="% url 'events' %" title="% trans 'Reset Filter' %"% else % href="% url 'genre' genre=genre.code %"% endif %> genre.name </a>

我的看法:

class EventListView(PageContextMixin, ListView):
    model = Booking
    page_context_kwargs = 'selected': reverse_lazy('events')
    template_name = 'events/event_list.html'

    def get_queryset(self):
        filter_ = 'eventlist': True # , 'season__in': settings.EVENTS_SEASONS
        self.rooms = settings.EVENTS_ROOMS
        self.genres = list(settings.EVENTS_GENRES)
        genre_names = dict([(g.evis_id, g.description_de) for g in Genre.objects.filter(evis_id__in=[g['evis_id'] for g in self.genres])])
        for genre in self.genres:
            genre['name'] = genre_names.get(genre['evis_id'], genre['name'])
        if 'genre' in self.kwargs:
            self.genre = [g for g in self.genres
                          if g['url'] == self.kwargs['genre']][0]
            filter_['eventgenre__genre__evis_id'] = self.genre['evis_id']
        elif 'room' in self.kwargs:
            self.room = [r for r in self.rooms if r['url'] == self.kwargs['room']][0]
            filter_['venue_description'] = self.room['venue_description']
        return self.model.objects.filter(**filter_)

HTML 模板:

<div id="eventlistcontainer">
    % if view.genres or view.rooms %
    <input type="checkbox" id="filteropener" class="hidden-input" />
    <div class="filterwrap">
        <label for="filteropener" class="filterlabel" title="% trans "Toggle Filter" %">% trans "Filter" %</label>
        % if view.genre or view.room %
        <span class="filtertag">
            : <b>% if view.genre % view.genre.name % else % view.room.name % endif %</b>
        </span>
        <a class="filterreset" href="% url 'events' %" title="% trans 'Reset Filter' %">
            <img src=" STATIC_URL images/icon_close.png"  />
        </a>
        % endif %
    </div>
    <div class="eventfilter">
        <div>
            <h2>% trans "Genre" %</h2>
            <ul class="linklist list1">
            % for genre in view.genres %
                <li>
                <a % if genre == view.genre % class="active" href="% url 'events' %" title="% trans 'Reset Filter' %"% else % href="% url 'genre' genre=genre.code %"% endif %> genre.name </a>
                </li>
            % if forloop.counter == 4 %
            </ul>
            <ul class="linklist list2">
            % endif %
            % endfor %
            </ul>
        </div>
        <div>
            <h2>% trans "Concert Venues" %</h2>
            <ul class="linklist list3">
            % for room in view.rooms %
                <li>
                <a % if room == view.room % class="active" href="% url 'events' %" title="% trans "Reset Filter" %"% else % href="% url "room" room=room.url %"% endif %> room.name </a>
                </li>
            % if forloop.counter == 6 %
            </ul>
            <ul class="linklist list4">
            % endif %
            % endfor %
            </ul>
        </div>
    </div>
    % endif %

    % with object_list|sort_by_highlight_past as events %
    <ul class="eventlist% if events.0.past % past% endif %">
        % for event in events %
        % ifchanged event.past %
        % if not forloop.first %
    </ul>
    <h3>Vergangene Veranstaltungen</h3>
    <ul class="eventlist past">
        % endif %
        % endifchanged %
        <li class=" event.status|default:"" % if forloop.first and not event.past % wide% endif %">
            % for im in event.eventimage_set.all|slice:":1" %
            <a href=" event.get_absolute_url " class="image">
                % if forloop.parentloop.first and not event.past %
                <img src=" im.image.image.3.url "  />
                % endif %
                <img src=" im.image.image.2.url "  />
            </a>
            % endfor %
            <div class="textbox">
                <a href=" event.get_absolute_url ">
                    <p class="date"> event.start|fancy_date </p>
                    <h2> event.name </h2>
                    <p class="location"> event.venue_description </p>
                </a>
                % if event.description_short %
                <p class="additional-info"> event.description_short </p>
                % endif %
                <a href=" event.get_absolute_url " class="button">% trans "Details" %</a>
                % if event.status %
                <p class="status">% trans event.status %!</p>
                % elif event.selling_status_code == "EF" %
                <a href=" event.get_absolute_url " class="button"> event.selling_status_description </a>
                % elif event|ticket_link %
                <a href=" event|ticket_link " class="button">% trans "Tickets" %</a>
                % endif %
            </div>
        </li>
        % endfor %
    </ul>
    % endwith %
</div>

类型

EVENTS_GENRES = (
    
        'url': 'orchestermusik',
        'evis_id': '1',
        'name': 'Orchestermusik'
    ,
    
        'url': 'vokale-musik',
        'evis_id': '2',
        'name': 'Vokale Musik'
    ,)

【问题讨论】:

见Reverse for '*' with arguments '()' and keyword arguments '' not found,它可能会给你一些提示。 【参考方案1】:

尝试将所有类型作为选项放在 URL 中是一个非常糟糕的主意。除此之外,查询只会被评估一次,因此 URL 将只接受在服务器启动时已经创建的流派。

相反,这是您在视图中检查的类型,例如 get_object_or_404;它具有完全相同的结果,如果流派不存在则返回 404。

但是,在这种特殊情况下,错误是因为您传递给% url % 标记的genre.code 的值由于某种原因为空。但是,如果没有看到模板或视图的其余部分,我们无法告诉您原因。

【讨论】:

不,您已经添加了一小部分视图,并且您还没有发布模板的其余部分。 现在完成了@daniel 我不明白您为什么不发布模板的其余部分。此时genre 是什么?它来自哪里? 好的,现在您需要显示settings.EVENTS_GENRES 是什么,因为此时正在迭代。 完成了,但是 settings.EVENTS_GENRES 我想使用 Model where is code filed,这不是硬编码的方法

以上是关于django 应用程序中的 url 中的 NoReverseMatch的主要内容,如果未能解决你的问题,请参考以下文章

将子域指向 Django 中的特定 url

两个应用程序如何响应 Django 中的同一个 URL?

将模板变量从 URL 传递到 Django 中的 FormPreview

Django 2+ 中的多个可选 URL 参数

Django 中的 STATIC_URL 和 STATIC_ROOT 有啥区别?

如何从 Django 中的 js html builder 获取 url?