django-view-breadcrumbs icon indicating copy to clipboard operation
django-view-breadcrumbs copied to clipboard

Breadcrumbs on complex view.

Open macumhail opened this issue 2 years ago • 0 comments

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?

macumhail avatar Nov 30 '22 19:11 macumhail