繁体   English   中英

Django Form with ForeignKey field NOT NULL constraint failed Error

[英]Django Form with ForeignKey field NOT NULL constraint failed Error

每个 model 都链接到前一个 model。我制作了一个表格来填写,因为所有模型都是链接的。 当我尝试将 model 地址链接到项目时,出现错误

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"]但根据您的 Model:

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实例都必须具有您未在ProjectForm中提供的这些Values

要处理此错误,您可以根据需要做两件事。

  1. 将此表格替换为:

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

或另一个不应该如何使用外键的选项。

  1. 用这个更改你的 class 并 makemigrations 并再次迁移:
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="Адрес")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM