Django Ошибка при обновлении представления, ассоциированного с моделью с внешними ключами
У меня есть модель, ProjectNoteComments, которая предназначена для добавления комментариев к ProjectNotes. Комментарии связаны с заметками, а заметки связаны с проектами через внешние ключи. ProjectNoteComments отображаются через представление ProjectNotesDetailView.
Когда я добавляю ProjectNoteCommentUpdateview и соответствующую ссылку на страницу детального просмотра заметки, я получаю следующую ошибку: Reverse for 'project_note_comment_update' with arguments '(6, 9, 20)' not found. Попробовано 1 шаблон(ы): ['projects/note/(?P[0-9]+)/comment/comment:pk/update\Z']
Я не смог понять, как решить эту проблему.
Мнения:
class ProjectNotesDetailView(FormMixin, DetailView):
model = ProjectNotes
id = ProjectNotes.objects.only('id')
template_name = 'company_accounts/project_note_detail.html'
comments = ProjectNotes.comments
form_class = NoteCommentForm
crumbs = [...]
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)
class ProjectNoteCommentUpdateView(UpdateView):
model = ProjectNoteComments
template_name = 'company_accounts/update_project_note_comment.html'
fields = ['body']
def get_success_url(self):
return reverse('company_project:project_note_detail', args=[self.kwargs.get('pk'), (self.object.id)])
URLs
path('project/<int:project_pk>/note/<int:pk>/', ProjectNotesDetailView.as_view(), name='project_note_detail'),
path('note/<int:pk>/comment/comment:pk/update', ProjectNoteCommentUpdateView.as_view(), name='project_note_comment_update'),
Соответствующий код шаблона
link on Projectnotedetail page:
<div class="header-edit-link col-sm">
{% if perms.company_project.can_change %}
<div><a href="{% url 'company_project:project_note_comment_update' object.project.pk object.pk comment.pk %}"><i class="fa fa-pencil mr-1"></i>edit</a></div>
{% endif %}
</div>
Update project note comment page:
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %}Update Comment{% endblock title %}
{% block content %}
<div class="section-container container">
<div class="general-form pl-md-5 pr-md-5">
<h2>Update Comment</h2>
<form action="" method="post">
{% csrf_token %}
{{ form.media }}
{{ form|crispy }}
</br>
<input type="submit" value="update">
</form>
</div>
</div>
{% endblock content %}
С некоторой помощью я смог решить эту проблему. Сначала я изменил соответствующий URL на:
path('project/<int:project_pk>/note/<int:projectnotes_pk>/comment/<int:pk>/update', ProjectNoteCommentUpdateView.as_view(), name='project_note_comment_update'),
Затем я изменил get_success_url на:
def get_success_url(self):
return reverse('company_project:project_note_detail', args=[self.kwargs.get('project_pk'), self.kwargs.get('projectnotes_pk')])
Соответствующая ссылка на странице ProjectNoteDetail была изменена на:
<div><a href="{% url 'company_project:project_note_comment_update' object.project.pk projectnotes.pk comment.pk %}"><i class="fa fa-pencil mr-1"></i>edit</a></div>