Sylas
Sylas

Reputation: 1

Django error NoReverseMatch

I am using Django 1.8.3 and Python 3.4, I'm facing the below issue when clicking on a link on my website.

This is the error page :
http://imgur.com/4HKlahP

Project Directory:

* cacademy:
    * __pycache__
    * __init__
    * settings
    * urls
    * wsgi
* Classes:
    * __pycache__
    * migrations
    * static
    * __init__
    * admin
    * models
    * tests
    * urls
    * views
* templates:
    * cacademy:
        * base.html
        * classes_list.html
        * courses_detail.html
* db.sqlite3
* manage.py

My Models:

from django.db import models
from django.utils import timezone


class Course(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()
    teachername = models.TextField(max_length=200)
    teacherinfo = models.TextField()
    started_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

My Views:

from django.shortcuts import render
from django.utils import timezone
from .models import Course
from django.shortcuts import render, get_object_or_404

def classes_list(request):
    courses = Course.objects.filter(started_date__lte=timezone.now()).order_by('started_date')
    return render(request, 'cacademy/classes_list.html', {'courses': courses})

def course_detail(request, pk):
    course = get_object_or_404(Course, pk=pk)
    return render(request, 'cacademy/courses_detail.html', {'course': course})

My Urls:

from django.conf.urls import include, url
from Classes import views
from django.contrib import admin
admin.autodiscover()

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', views.classes_list, name='classes_list'),
    url(r'^(?P<pk>[0-9]+)/Course/$', views.course_detail, name='Course_detail'),
    ]

classes_list.html:

 {% extends "cacademy/base.html" %}
 {% load staticfiles %}
 {% block content %}
         <div>
             <h2> Remember you can only register 3 Courses at once!</h2>
         </div>
     {% for course in courses %}
         <div course="post">
                 <div course="date">
                     {{ course.started_date }}
                 </div>
             <h1><a href="{% url 'course_detail' pk=Course.pk %}">{{ course.title }}</a></h1>
             <p>Taught by: {{ course.teachername|linebreaks }}</p>
         </div>
     {% endfor %}
 {% endblock content %}

Upvotes: 0

Views: 170

Answers (2)

Rahul Gupta
Rahul Gupta

Reputation: 47846

Firstly, you have assigned reverse name for courses detail url as Course_detail in urls.py but you are using the reverse name as course_detail in your template. It should have been Course_detail in the template.

Secondly, you are passing pk as Course.pk in your template. It should have been course.pk instead as you are using course variable when iterating over courses objects.

Instead use reverse name with lowercase initial to remove the case-sensitive issues.

urls.py

from django.conf.urls import include, url
from Classes import views
from django.contrib import admin
admin.autodiscover()

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', views.classes_list, name='classes_list'),
    url(r'^(?P<pk>[0-9]+)/Course/$', views.course_detail, name='course_detail'), # assign reverse name with lowercase initial letter
    ] 

Then in your template, you can do this:

classes_list.html

{% extends "cacademy/base.html" %}
 {% load staticfiles %}
 {% block content %}
         <div>
             <h2> Remember you can only register 3 Courses at once!</h2>
         </div>
     {% for course in courses %}
         <div course="post">
                 <div course="date">
                     {{ course.started_date }}
                 </div>
             <h1><a href="{% url 'course_detail' pk=course.pk %}">{{ course.title }}</a></h1>
             <p>Taught by: {{ course.teachername|linebreaks }}</p>
         </div>
     {% endfor %}
 {% endblock content %}

Upvotes: 0

Othman
Othman

Reputation: 3018

Change your template url tag to

{% url 'course_detail' course.id %}

and in your urls.py

url(r'^(?P<pk>[0-9]+)/course/$', views.course_detail, name='course_detail')

Upvotes: 1

Related Questions