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
(связанные имена могут вызвать проблему в этом месте.