0

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'
    },)
git-e
  • 269
  • 1
  • 4
  • 15
  • See [Reverse for '*' with arguments '()' and keyword arguments '{}' not found](http://stackoverflow.com/questions/1842389/reverse-for-with-arguments-and-keyword-arguments-not-found), it might give you some hints. – Wiktor Stribiżew Nov 08 '16 at 08:56

1 Answers1

1

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.

Daniel Roseman
  • 588,541
  • 66
  • 880
  • 895
  • No, you've added a small part of your view, and you haven't posted the rest of the template either. – Daniel Roseman Nov 08 '16 at 09:15
  • Now it is complete @daniel – git-e Nov 08 '16 at 09:19
  • I don't understand why you won't post the rest of the template. What is `genre` at this point? Where is it coming from? – Daniel Roseman Nov 08 '16 at 09:21
  • OK, now you need to show what `settings.EVENTS_GENRES` is, since that is what is being iterated at this point. – Daniel Roseman Nov 08 '16 at 09:35
  • Done, but instead settings.EVENTS_GENRES I want to use Model where is code filed, this is not hardcoded appproach – git-e Nov 08 '16 at 09:43
  • I don't know what you mean. You are iterating through `self.genre`, which is set to that setting. As you have shown, the dicts in that list don't have a `code` key, they have `url`; maybe you meant to use that instead? – Daniel Roseman Nov 08 '16 at 09:44
  • I wanted to use model with another fields instead of settings.EVENTS_GENRES but aslo this solution is ok. Now when I use settings.EVENTS_GENRES i get an error: Reverse for 'genre' with arguments '()' and keyword arguments '{u'genre': ''}' not found. 0 pattern(s) tried: [] in template – git-e Nov 08 '16 at 09:54