git-e
git-e

Reputation: 299

NoReverseMatch in url in django app

I have url and everythis should be OK but I get an error.

This is my url:

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

Here is error message:

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

In this line of html code:

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

My view:

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 template:

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

Genres

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

Upvotes: 0

Views: 74

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599610

Trying to put all your Genres in the URL as options is a very bad idea. Apart from anything else, the query will only be evaluated once, so the URL will only accept Genres that had already been created at server startup.

Instead, this is the kind of thing you check in the view, with something like get_object_or_404; it has exactly the same result, of returning a 404 if the genre doesn't exist.

However, in this particular case the error is because the value of genre.code that you are passing to the {% url %} tag is empty for some reason. Without seeing the rest of the template or the view, though, we can't tell you why.

Upvotes: 1

Related Questions