Django Form with ForeignKey field NOT NULL constraint failed Error

Каждая модель связана цепочкой с предыдущей моделью. Я делаю одну форму для заполнения, так как все модели связаны. Когда я пытаюсь связать адрес модели с проектом, появляется ошибка

Не удалось выполнить ограничение NOT NULL: crm_project.address_id /crm/views.py, строка 39, в add_project form_project.save()

Модели

class City(models.Model):
    obl = models.CharField(max_length=255, choices=REGIONS, default="24", verbose_name="Регион")
    name = models.CharField(max_length=128, verbose_name="Город")
    population = models.IntegerField()

    def __str__(self):
        return self.name


class Address(models.Model):
    city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name="Город")
    street = models.CharField(max_length=255, verbose_name="Улица")
    numb = models.CharField(max_length=64, verbose_name="Номер дома")

    def __str__(self):
        return f"{self.street}, {self.numb}"

class Project(models.Model):
    manager = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name="Сотрудник")
    address = models.ForeignKey(Address, on_delete=models.PROTECT, verbose_name="Адрес")
    # another fields

class ProjectDetail(models.Model):
    project = models.OneToOneField(Project, on_delete=models.CASCADE, verbose_name="Проект")
    # another fields

Forms

class AddressForm(forms.ModelForm):
    class Meta:
        model = Address
        fields = ["city", "street", "numb"]

    def __init__(self, *args, **kwargs):
        city = kwargs.pop("city", "")
        super(AddressForm, self).__init__(*args, **kwargs)
        self.fields["city"] = forms.ModelChoiceField(queryset=City.objects.all())


class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = ["file", "sq", "rent_tax"]

class ProjectDetailForm(forms.ModelForm):
    class Meta:
        model = ProjectDetail
        exclude = ['project', 'comment', 'resume', 'complite', 'created_at']

Виды

def add_project(request):
    form_address = AddressForm(request.POST or None)
    form_project = ProjectForm(request.POST or None)
    form_detail = ProjectDetailForm(request.POST or None)

    if request.method == 'POST':
        if form_address.is_valid() and form_project.is_valid() and form_detail.is_valid():
            address = form_address.save(commit=False)
            form_project.manager = request.user
            form_project.address = address
            project = form_project.save(commit=False)
            form_detail.project = project

            form_address.save()
            form_project.save()
            form_detail.save()

    
    context = {'form_address':form_address, 'form_project':form_project, 'form_detail':form_detail,}

    return render(request, 'crm/project_form.html', context)

В вашем ProjectForm вы указали только эти поля fields = ["file", "sq", "rent_tax"] но в соответствии с вашей моделью:

class Project(models.Model):
    manager = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name="Сотрудник")
    address = models.ForeignKey(Address, on_delete=models.PROTECT, verbose_name="Адрес")

Здесь два поля null=False Значит, каждый экземпляр Project должен иметь эти Values, которые вы не предоставляете в ProjectForm

Чтобы справиться с этой ошибкой, вы можете сделать две вещи в соответствии с вашими потребностями.

  1. замените эту форму на эту:

class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = '__all__"

или другой вариант, который не является тем, как вы должны использовать внешние ключи.

  1. измените свой класс на этот, сделайте миграцию и мигрируйте снова:
class Project(models.Model):
    manager = models.ForeignKey(User, on_delete=models.PROTECT,null=True, blank=True, verbose_name="Сотрудник")
    address = models.ForeignKey(Address, on_delete=models.PROTECT, null=True, blank=True,verbose_name="Адрес")
Вернуться на верх