Reverse for 'list-events' not found

Im currently following a Django tutorial to learn views and URLs. I have watched the tutorial over and over and cant see what I am doing wrong.

I receive the error: Exception Value:

Reverse for 'list-events' not found. 'list-events' is not a valid view function or pattern name.

Views.py from django.shortcuts import render, redirect import calendar from calendar import HTMLCalendar from datetime import datetime from .models import Event, Venue from .forms import VenueForm, EventForm from django.http import HttpResponseRedirect

# Create your views here.
# all events is listed in the urls.py hence why the function is named all_events
def update_event(request, event_id):
    event = Event.objects.get(pk=event_id)
    form = EventForm(request.POST, instance=event)
    if form.is_valid():
        form.save()
        return redirect('list-events')
    return render(request, 'events/update_event.html',
                  {'event': event,
                   'form':form})


def add_event(request):

    submitted = False

    if request.method == 'POST':
        form = EventForm(request.POST)

        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/add_event?submitted=True')
    else:
        form = EventForm
    if 'submitted' in request.GET:
        submitted = True
    return render(request, 'events/add_event.html', {'form': form, 'submitted': submitted})


def update_venue(request, venue_id):
    venue = Venue.objects.get(pk=venue_id)
    form = VenueForm(request.POST, instance=venue)
    if form.is_valid():
        form.save()
        return redirect('list-venues')

    return render(request, 'events/update_venue.html',
                  {'venue': venue,
                   'form': form})


def search_venues(request):
    if request.method == "POST":
        searched = request.POST['searched']
        venues = Venue.objects.filter(name__contains=searched)
        return render(request,
                      'events/search_venues.html',
                      {'searched': searched,
                       'venues': venues})
    else:
        return render(request,
                      'events/search_venues.html',
                      {})


def show_venue(request, venue_id):
    venue = Venue.objects.get(pk=venue_id)
    return render(request, 'events/show_venue.html',
                  {'venue': venue})


def list_venues(request):
    venue_list = Venue.objects.all()
    return render(request, 'events/venue.html',
                  {'venue_list': venue_list})

URLS.py
from django.urls import path
from . import views


urlpatterns = [
    
    path('', views.home, name="home"),
    path('<int:year>/<str:month>/', views.home, name="home"),
    path('events', views.all_events, name='list_events'),
    path('add_venue', views.add_venue, name='add-venue'),
    path('list_venues', views.list_venues, name='list-venues'),
    path('show_venue/<venue_id>', views.show_venue, name='show-venue'),
    path('search_venues', views.search_venues, name='search-venues'),
    path('update_venue/<venue_id>', views.update_venue, name='update-venue'),
    path('add_event', views.add_event, name='add-event'),
    path('update_event/<event_id>', views.update_event, name='update-event'),

event_list.html:

{% extends 'events/base.html' %}

{% block content %}

<h1>Event  </h1>
<br />

{% for event in event_list %}

<div class="card">
  <div class="card-header">
    {{Event}}
  </div>
  <div class="card-body">
    <h5 class="card-title">Venue: {{ event.venue }}</h5>
    <p class="card-text">
    <ul>
      <li>Date: {{ event.event_date }}</li>
      <li>Event Venue: {{ event.venue.web }}</li>      
      <li>Manager: {{ event.manager }}</li>
      <li>Desc: {{ event.description }}</li>

      <li>Attendees:<br />
        {% for user in event.attendees.all %}
        {{ user }}<br/>
        {% endfor %}
        </li>
        </ul>
     
      
    



    </p>
  </div>
  <div class="card-footer text-muted">
    <a href="{% url 'update-event' event.id %}" class="btn btn-outline-secondary btn-sm">Update Event</a>
  </div>
</div>



<br /><br />
{% endfor %}

    {% endblock %}

You have defined your url in the "urls.py" file with the name of "list_events" (note the underscore). In the views you have used it as "list-events" (note the hyphen).

You can fix that by following one of these options:

1.You can change that in the views (by using underscore instead of hyphen):

return redirect('list_events')

2.Or changing it in the url (by using hyphen instead of underscore):

path('events', views.all_events, name='list-events'),

Hope it helps.

Back to Top