'Django Breadcrumb error: Reverse for 'projectnotes_list' with no arguments not found

I am trying to use django-views-breadcrumbs to add breadcrumbs to a site. I can get it to work with some views but I am getting an error with a particular listview. When I attempt to visit this listview page I see the error.

The error appears to be related to a need for the correct context. So far I have not been able to figure this out.

The error:

NoReverseMatch at /projects/project/1/notes/
Reverse for 'projectnotes_list' with no arguments not found. 1 pattern(s) tried: ['projects/project/(?P<pk>[0-9]+)/notes/\\Z']
Request Method: GET
Request URL:    http://co1.localhost:8000/projects/project/1/notes/
Django Version: 3.1.14
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'projectnotes_list' with no arguments not found. 1 pattern(s) tried: ['projects/project/(?P<pk>[0-9]+)/notes/\\Z']
Exception Location: /Users/user/.local/share/virtualenvs/osite-wGphEfbP/lib/python3.9/site-packages/django/urls/resolvers.py, line 689, in _reverse_with_prefix
Python Executable:  /Users/user/.local/share/virtualenvs/osite-wGphEfbP/bin/python
Python Version: 3.9.6
Python Path:    
['/Users/user/Desktop/otools',
 '/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
 '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
 '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
 '/Users/user/.local/share/virtualenvs/osite-wGphEfbP/lib/python3.9/site-packages']
Server time:    Sun, 20 Feb 2022 15:52:17 +0000

The list view:

class ProjectNotesList(ListBreadcrumbMixin,ListView):
    model = ProjectNotes
    template_name = 'company_accounts/project_notes.html'
    comments = ProjectNotes.comments


    def related_project(self, **kwargs):
        project = get_object_or_404(Project, id=self.kwargs.get('pk'))
        notes = ProjectNotes.objects.all
        return notes

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super().get_context_data(**kwargs)

        context['project'] = get_object_or_404(Project, id=self.kwargs.get('pk'))
        return context



    commentscount = ProjectNotes.objects.annotate(num_comments=Count('comments'))

The urls.py

from django.urls import path, include
from .views import CompanyProjects, CompanyProjectsDetailView, TodoCreateView, ProjectNotesList, ProjectNotesCreateView, ProjectCreateView, ProjectNotesDetailView, CompanyCompletedProjects, CompanyPausedProjects, TodosList, ProjectTodosDetailView, ProjectDocumentsList, ProjectDocumentsCreateView, ProjectDocumentsDetailView
from . import views

app_name = 'company_project'

urlpatterns = [
    path('', CompanyProjects.as_view(), name='project_list'),
    path('completed_projects', CompanyCompletedProjects.as_view(), name='completed_projects'),
    path('paused_projects', CompanyPausedProjects.as_view(), name='paused_projects'),
    path('add_project/', ProjectCreateView.as_view(), name='add_project'),
    path('project/<int:pk>/', CompanyProjectsDetailView.as_view(), name='project_detail'),
    path('project/<int:pk>/todos/', TodosList.as_view(), name='project_todos'),
    path('project/<int:project_pk>/todo/<int:pk>/', ProjectTodosDetailView.as_view(), name='project_todo_detail'),
    path('project/<int:pk>/add_todo/', TodoCreateView.as_view(), name='add_todo'),
    path('project/<int:pk>/add_project_note/', ProjectNotesCreateView.as_view(), name='add_project_note'),
    path('project/<int:pk>/notes/', ProjectNotesList.as_view(), name='projectnotes_list'),
    #path('note/<int:pk>/add_project_note_comment/', ProjectNotesCommentCreateView.as_view(),
     #    name='add_project_note_comment'),
    path('project/<int:project_pk>/note/<int:pk>/', ProjectNotesDetailView.as_view(), name='project_note_detail'),
    path('project/<int:pk>/documents/', ProjectDocumentsList.as_view(), name='project_documents'),
    path('project/<int:pk>/add_project_document/', ProjectDocumentsCreateView.as_view(), name='add_project_document'),
    path('project/<int:project_pk>/document/<int:pk>/', ProjectDocumentsDetailView.as_view(), name='project_document_detail'),

]

The base and page templates:

base
<!DOCTYPE html>
{% load static %}
{% load view_breadcrumbs %}
<html>
<head>
  <meta charset="utf-8">
  <title>{% block title %}Site{% endblock title %}</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  

  <!-- Bootstrap CSS -->
  


  <link type="text/x-scss" href="{% static 'bootstrap/scss/bootstrap.scss' %}" rel="stylesheet" media="screen">

  <!-- Custom CSS -->
  <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}"/>
  <link rel="shortcut icon" type="image/png" href="{% static 'core_images/OH_favicon.png' %}"/>
  
  <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-VJRXH7YFXZ"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-VJRXH7YFXZ');
</script>
  
</head>
<body>
 <wrapper class="d-flex flex-column">
 {% include 'nav.html' %}
  <main class="flex-fill">
  <div class="row">
    <div class="col-12">
      <br />
      {% block breadcrumbs %}
       {% render_breadcrumbs 'view_breadcrumbs/bootstrap4.html' %} 
      {% endblock breadcrumbs %}
      
      {% block messages %}{% endblock messages %}
    </div>
  </div>
      {% block content %}
      <h1>Hello</h1>
      {% endblock content %}
  </main>
  {% include 'footer.html' %}

  <!-- Optional JavaScript -->
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script
  src="https://code.jquery.com/jquery-3.6.0.min.js"
  integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
  crossorigin="anonymous"></script>  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
 </wrapper>
</body>
</html>

page
<!-- templates/company_accounts/project_notes.html -->

{% extends 'base.html' %}

  {% block content %}
  <div class="section-container container">
    <div class="general-section-header">
      <div class="header-add-new">
       <a class="btn btn-success" href="{% url 'company_project:add_project_note' project.pk %}" role="button">Add Note</a>
     </div>
      <h1>Notes for {{ project }}</h1>
    </div>
     {% if project.notes.all %}
     {% for note in project.notes.all %}
       <div class ="projectnotes-entry">
         
      <div class="col-sm-8">
       <div class="row-sm-6">
        <div class="card mb-2">
          <div class="card-body">
            <div class="card-title"><a href="{% url 'company_project:project_note_detail' project.pk note.pk %}">{{ note.title }}</a></div>
            <div class="card-text">{{ note.body | safe | truncatewords:"20"|linebreaks }}
            <div>{{ note.comments.all.count }} comments</div>      
            <a href="{% url 'company_project:project_note_detail' project.pk note.pk %}">read more</a></div>
         </div>
       </div>
      </div>
      </div>     
     </div>
     {% endfor %}
     {% else %}
     <p>No notes have been have been added yet.</p>
     {% endif %}
   </div>
  {% endblock content %}

There is a demo included with the breadcrumb app the provides some insight. However I have not been able to figure out how to add necessaryt context using code from the demo. The demo code:

class TestListsView(ListBreadcrumbMixin, ListView):
    model = TestModel
    template_name = "demo/test-list.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        view_paths = []

        for instance in self.object_list:
            view_paths.append(
                (
                    instance.name,
                    detail_instance_view_url(instance),
                ),
            )
        context["view_paths"] = view_paths
        return context


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source