Django Сохранение формы с двумя внешними ключами

Я пытаюсь сохранить форму, которая представляет данные (комментарии к заметкам проекта), связанные с другой моделью (заметки проекта) через внешний ключ (заметки проекта). Примечания к проектам связаны через внешний ключ с другой моделью (проекты). Я думал, что мне нужно будет рассмотреть только непосредственную связь (заметки проекта). Однако, судя по ошибке, которую я получаю, мне также необходимо обработать связь между заметками проекта и проектом.

Ошибка:

IntegrityError at /projects/note/1/add_project_note_comment/
insert or update on table "company_project_projectnotes" violates foreign key constraint "company_project_proj_project_id_478f433c_fk_company_p"
DETAIL:  Key (project_id)=(0) is not present in table "company_project_project".

Модели:

class Project(models.Model):
    title = models.CharField(max_length= 200)
    description = tinymce_models.HTMLField()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse ('project_detail', args=[str(self.id)])

class ProjectNotes(models.Model):
    title = models.CharField(max_length=200)
    body = tinymce_models.HTMLField()
    date = models.DateField(auto_now_add=True)
    project = models.ForeignKey(Project, default=0, blank=True, on_delete=models.CASCADE, related_name='notes')

    def __str__(self):
        return self.title

class ProjectNoteComments(models.Model):
    body = tinymce_models.HTMLField()
    date = models.DateField(auto_now_add=True)
    projectnote = models.ForeignKey(ProjectNotes, default=0, blank=True, on_delete=models.CASCADE, related_name='notes')

Вид:

class ProjectNotesCommentCreateView(CreateView):
    model = ProjectNotes
    template_name = 'company_accounts/add_project_note_comment.html'
    fields = ['body']

    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.save()
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('project_detail', args=[self.kwargs.get('pk')])

Шаблон URL:

path('note/<int:pk>/add_project_note_comment/', ProjectNotesCommentCreateView.as_view(), name='add_project_note_comment'),

Шаблон:

{% extends 'base.html' %}
{% load crispy_forms_tags %}

  {% block content %}
  <h1>Add Comment</h1>
  
   <form action="" method="post">
    {% csrf_token %}
    {{ form.media }}
    {{ form|crispy }}
    <input type="submit" value="save">
   </form>
  
  {% endblock content %}

Есть идеи, как заставить это работать?

У вас не будет связи с полем pk поля ProjectNoteComments с полем ProjectNote model и связанные имена одинаковы для обеих моделей, возможно, вы захотите это исправить.

Более того, вы задерживаете коммитирование формы только для ProjectNote, но вам также придется обрабатывать ее и для модели Project через обратную ссылку projectnote__project (связанные имена могут вызвать проблему в этом месте.

).
Вернуться на верх