Django & Form с SelectMultiple: нулевое значение в столбце x отношения y нарушает ограничение not-null

Я сталкиваюсь со следующей ошибкой при попытке сохранить проект после заполнения формы, где я выбираю несколько тегов для этого проекта:

null значение в столбце "tag_id" отношения "project_tags" нарушает ограничение not-null ПОДРОБНАЯ ИНФОРМАЦИЯ: Неудачная строка содержит (10263, 10262, null). --> project_tags(id, project_id, tag_id)

Модель базы данных проста: У меня есть проекты, и у каждого проекта есть тег(ы). Все определяется следующими моделями:

class Project(models.Model):
    id = models.AutoField(primary_key=True)
    client = models.ForeignKey(User, on_delete=models.CASCADE)
    start_date = models.DateField()
    end_date = models.DateField()

    class Meta:
        managed = False
        db_table = 'project'

    def get_absolute_url(self):
        return reverse('project-detail', kwargs={'pk': self.pk})

class ProjectTag(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=30)

    class Meta:
        managed = False
        db_table = 'project_tag'

    def __str__(self):
        return self.name

class ProjectTags(models.Model):
    id = models.AutoField(primary_key=True)
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    tag = models.ManyToManyField(ProjectTag)

    class Meta:
        managed = False 
        db_table = 'project_tags'

Вид следующий:

@login_required
def add_project(request):
    submitted = False
    if request.method == "POST":
        form1 = ProjectForm(request.POST)
        form2 = ProjectTagsForm(request.POST)

        if form1.is_valid() and form2.is_valid():
            form1_part = form1.save(commit=False)
            form1_part.client = request.user
            form1_part.save()

            project_id = Project.objects.get(id=form1_part.id)
            form2_part = form2.save(commit=False)
            form2_part.project = project_id
            form2_part.save()

            return HttpResponseRedirect('/project/new?submitted=True')
    else:
        form1 = ProjectForm
        form2 = ProjectTagsForm
        if 'submitted' in request.GET:
            submitted = True

    context = {'form1':form1
               ,'form2':form2
               ,'submitted':submitted
               }

    return render(request, 'home_page/add_project.html',context)

WIth следующие формы, которые обе находятся в одном шаблоне:

class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = ('start_date', 'end_date')

    def __init__(self, *args, **kwargs):
        super(ProjectForm, self).__init__(*args, **kwargs)

class ProjectTagsForm(forms.ModelForm):
    class Meta:
        model = ProjectTags
        fields = ('tag',)
        widgets = {
            'tag': forms.SelectMultiple(attrs={'class': 'form-control','size': 12})
        }



{% if submitted %}
    Your project was submitted successfully!
{% else %}
    <form action="" method=POST>
        {% csrf_token %}
        {{ form1.as_p }}
        {{ form2 }}
    <input type="submit" value="submit me" class="btn btn-secondary">

Я понимаю проблему, что после отправки формы она не может преобразовать выбранные имена тегов в tag_ids для заполнения записей (id,project_id,tag_id) и вставки их в таблицу db (так как таблица не позволяет nulls в качестве tag_id), но я понятия не имею, как это исправить, особенно когда это практически копи-паст этого видео Codemy и его скрипта, где это работало https://youtu.be/x99hW1N8Nug

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