Отправка формы Django с использованием отношения "один-ко-многим
Я пытаюсь реализовать отношения "один ко многим" между двумя моделями в Django, и делал это на основе этого ответа.
У меня есть очень простая модель Projects и модель ProjectNotes, так что один проект может иметь несколько Notes.
Мой models.py:
class Project(models.Model):
project_name = models.CharField(max_length=500)
project_type = models.CharField(max_length=500)
project_leader = models.CharField(max_length=500)
class ProjectNotes(models.Model):
note_date = models.DateField(default=date.today)
assigned_project = models.ForeignKey(Project, related_name='projectnotes', on_delete=models.CASCADE)
note = models.TextField(max_length=500)
Мой вариант использования - показать веб-страницу с информацией для данного объекта Project, и показать форму текстового поля, где могут быть добавлены заметки (также показывая любые заметки, которые могут существовать).
Для этого у меня есть мой файл forms.py:
class AddProjectNoteForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AddProjectNoteForm, self).__init__(*args, **kwargs)
self.fields['note'].required = True
class Meta:
model = ProjectNotes
fields = ['note']
Мой шаблон правильно отображает поле формы (и, как я полагаю, правильно отображает все существующие заметки), однако при попытке отправить заметку я получаю ошибку, сообщающую, что поле id является null:
null value in column "attached_project_id" violates not-null constraint
Насколько я понимаю, поле project_id не может быть пустым, но поскольку я его не определяю, это то, что django обрабатывает внутренне. Если это так, то почему он не делает этого здесь? Иначе (или даже так), каково решение?
редактирование:
Представление, которое обрабатывает сохранение формы, является:
def listprojects(request, pid):
project = project.objects.get(id=pid)
projectnotes = project.projectnotes.all()
if request.method == 'POST':
if 'newprojectnote' in request.POST:
newprojectnoteform = NewProjectNoteForm(request.POST)
if newprojectnoteform.is_valid():
newprojectnoteform.save()
context = {
'project': project,
'projectnotes': projectnotes,
'pid': pid,
'newprojectnoteform': newprojectnoteform,
}
return render(request, 'projects/list.html', context)