【问题标题】:NoReverseMatch in url in django appdjango 应用程序中的 url 中的 NoReverseMatch
【发布时间】: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" alt="{% trans 'Reset Filter' %}" />
        </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 }}" alt="{{ im.text }}" />
                {% endif %}
                <img src="{{ im.image.image.2.url }}" alt="{{ im.text }}" />
            </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'
    },)

【问题讨论】:

标签: python regex django url


【解决方案1】:

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

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

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

【讨论】:

  • 不,您已经添加了一小部分视图,并且您还没有发布模板的其余部分。
  • 现在完成了@daniel
  • 我不明白您为什么不发布模板的其余部分。此时genre 是什么?它来自哪里?
  • 好的,现在您需要显示settings.EVENTS_GENRES 是什么,因为此时正在迭代。
  • 完成了,但是 settings.EVENTS_GENRES 我想使用 Model where is code filed,这不是硬编码的方法
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 2013-10-16
  • 2023-03-28
  • 2011-05-14
  • 2014-02-18
  • 1970-01-01
  • 2014-01-31
  • 2013-09-26
相关资源
最近更新 更多