django-view-breadcrumbs
django-view-breadcrumbs copied to clipboard
Breadcrumbs on complex view.
I am having trouble figuring out how to get breadcrumbs working on a view that includes both a primary key and a foreign key. In this case there is a project content type (model) and projects can have notes associated with them. I have the breadcrumbs working until a user tries to view an individual note - projects/project/notes/note. I can't figure out how to get the select the relevant ids.
The view:
class ProjectNotesDetailView(DetailBreadcrumbMixin, FormMixin, DetailView):
model = ProjectNotes
id = ProjectNotes.objects.only('id')
template_name = 'company_accounts/project_note_detail.html'
comments = ProjectNotes.comments
form_class = NoteCommentForm
@cached_property
def crumbs(self):
project = self.get_object()
return [
("Projects", reverse(
"company_project:" + CompanyProjects.list_view_name, )
),
(f"{project.title}",
reverse(
"company_project:" + CompanyProjectsDetailView.detail_view_name,
kwargs={'pk': project.id})
),
("Notes", reverse(
"company_project:" + ProjectNotesList.list_view_name,
kwargs={'pk': project.id})
),
(f"{ProjectNotes.title}",
reverse(
"company_project:" + ProjectNotesDetailView.detail_view_name,
kwargs={'pk': project.id, 'note_pk': self.kwargs.get('pk')})
),
]
def get_object(self):
return get_object_or_404(Project, id=self.kwargs.get('pk'))
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
def form_valid(self, form):
projectnote = get_object_or_404(ProjectNotes, id=self.kwargs.get('pk'))
comment = form.save(commit=False)
comment.projectnote = projectnote
comment.created_by = self.request.user
comment.save()
return super().form_valid(form)
def get_success_url(self):
return reverse('company_project:project_note_detail', args=[self.kwargs.get('pk'), (self.object.id)])
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseForbidden()
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
The URL:
path('project/<int:project_pk>/note/<int:pk>/', ProjectNotesDetailView.as_view(), name='projectnotes_detail'),
The models:
class Project(models.Model):
title = models.CharField(max_length= 200)
description = tinymce_models.HTMLField()
status = models.CharField(max_length=20, choices=PROJECT_CHOICES, default="active")
date = models.DateTimeField(auto_now_add=True, null=True)
created_by = models.ForeignKey(CustomUser, editable=False, null=True, blank=True, on_delete=models.RESTRICT)
tags = tagulous.models.TagField(to=SiteWideTags, blank=True, related_name='projects_tags')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('company_project:project_detail', args=[str(self.id)])
class ProjectNotes(models.Model):
title = models.CharField(max_length=200)
body = tinymce_models.HTMLField()
project = models.ForeignKey(Project, default=0, blank=True, on_delete=models.CASCADE, related_name='notes')
date = models.DateTimeField(auto_now_add=True, null=True)
created_by = models.ForeignKey(CustomUser, editable=False, null=True, blank=True, on_delete=models.RESTRICT)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('company_project:project_note_detail', args=[self.project_id, str(self.id)])
Any suggestions for solving this?