Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Django – NoReverseMatch Error even with correct parameters (no namespacing)

I’m trying to create an app that stores problems (specifically math problems), and displays them to the user. I haven’t add much of the functionality that I want to yet, and as I’m fairly new to Django, I have been following along with the Django Tutorial project, and changing it according to my needs. However, I’m encountering a NoReverseMatch error even though I seem to be passing in the correct parameters. My code is below.

models.py

import imp
from django.db import models
from django.urls import reverse
import uuid

# Create your models here.

class Source(models.Model):
    '''Model that represents the source of a problem (e.g. AMC, AIME, etc.)'''
    problem_source = models.CharField(max_length=20)
    problem_number = models.PositiveSmallIntegerField()

    def __str__(self):
        '''toString() method'''
        return f'{self.problem_source} #{self.problem_number}'

class Topic(models.Model):
    '''Model that represents the topic of a problem (e.g. Intermediate Combo)'''
    problem_topic = models.CharField(max_length=50)
    problem_level = models.CharField(max_length=15)

    def __str__(self):
        return f'{self.problem_level} {self.problem_topic}'

class Problem(models.Model):
    '''Model that represents each problem (e.g. AIME #1, AMC #11, etc.)'''

    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    source = models.OneToOneField(Source, on_delete=models.RESTRICT, null=True, unique=True)
    problem_text = models.TextField()
    topic = models.ManyToManyField(Topic)

    def __str__(self):
        """String for representing the Model object."""
        return f'{self.source}'

    def get_absolute_url(self):
        """Returns the url to access a detail record for this book."""
        return reverse('problem-detail', args=[str(self.id)])

urls.py

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('problems/', views.ProblemListView.as_view(), name='problems'),
    path('problem/<int:pk>', views.ProblemListView.as_view(), name='problem-detail'),
]

views.py

import imp
from django.shortcuts import render

# Create your views here.

from .models import Problem, Source, Topic

def index(request):
    '''View function for home page of site'''

    # generate counts of the main objects

    num_problems = Problem.objects.all().count()

    context = {
        'num_problems': num_problems,
    }

    return render(request, 'index.html', context=context)

from django.views import generic

class ProblemListView(generic.ListView):
    model = Problem

class ProblemDetailView(generic.DetailView):
    model = Problem

Links to my HTML files are below:
base_generic.html: link
problem_list.html: link
problem_detail.html: link

My workspace is structured as follows:

trivial
    catalog
        migrations
        static/css
            styles.css
        templates
            catalog
                problem_detail.html
                problem_list.html
            base_generic.html
            index.html
        __init.py
        admin.py
        apps.py
        models.py
        tests.py
        urls.py
        views.py
    trivial
        __init__.py
        asgi.py
        settings.py
        urls.py
        wsgi.py
    db.sqlite3
    manage.py

I have read other StackOverflow posts, but none seem to apply to my situation. Also, in problem_list.html, if the value in the href link is Problem.get_absolute_url, the site will load, but clicking the link for "all problems" will lead back to the same page. But, if I put prob.get_absolute_url in the href link, I get a NoReverseMatch error.

Here is the exact error that I am getting:

NoReverseMatch at /catalog/problems/

Reverse for 'problem-detail' with arguments '('41b936f7-3c08-4fb9-a090-2d466348d34d',)' not found. 1 pattern(s) tried: ['catalog/problem/(?P<pk>[0-9]+)\\Z']

Request Method:     GET
Request URL:    http://127.0.0.1:8000/catalog/problems/
Django Version:     4.0.2
Exception Type:     NoReverseMatch
Exception Value:    

Reverse for 'problem-detail' with arguments '('41b936f7-3c08-4fb9-a090-2d466348d34d',)' not found. 1 pattern(s) tried: ['catalog/problem/(?P<pk>[0-9]+)\\Z']

Django is telling me that the error stems from calling prob.get_absolute_url in problem_list.html

>Solution :

The problem is that your id on the Problem model is a UUID, but your URL pattern is expecting an integer value as the pk – because you have prefixed the named pattern with int::

path('problem/<int:pk>', views.ProblemListView.as_view(), name='problem-detail'),

It should work if you change it to:

path('problem/<str:pk>', views.ProblemListView.as_view(), name='problem-detail'),
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading