簡體   English   中英

Django應用程序中的URL中的NoReverseMatch

[英]NoReverseMatch in url in django app

我有網址,一切都可以,但出現錯誤。

這是我的網址:

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

嘗試將所有流派作為選項放置在URL中是一個非常糟糕的主意。 除此以外,查詢只會被評估一次,因此該URL僅接受服務器啟動時已經創建的流派。

相反,這是您在視圖中檢查的事情,類似於get_object_or_404 它具有完全相同的結果,如果類型不存在,則返回404。

但是,在這種特定情況下,該錯誤是由於某些原因,您傳遞給{% url %}標記的genre.code的值為空。 但是,如果沒有看到模板的其余部分或視圖,我們將無法告訴您原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM