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的主要内容,如果未能解决你的问题,请参考以下文章
将模板变量从 URL 传递到 Django 中的 FormPreview