Django - id null - 外键错误

时间:2016-05-11 19:20:56

标签: sql django python-2.7 django-forms

错误:

app_a.desc_id may not be NULL

我相信我的问题是,当我保存时,我没有将idformB传递给formA。请引导我找到解决这个问题的方法。

以下是我的观点:

def form(request):
    if request.method == 'GET':
        formB = BForm()
        formA = AForm()
        return render(request,r'app/form.html',{'formA':formA,'formB':formB})
    elif request.method == 'POST':
        formA = AForm(request.POST)
        formB = BForm(request.POST)
        formB.save()
        formA.save()
        return HttpResponseRedirect('/log')

以下是我的模特:

# Descprition
class B(models.Model):
    id = models.AutoField(primary_key=True)
    description = models.CharField(max_length=50)

# Title
class A(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField('Name',max_length=20)
    desc = models.ForeignKey(B)

这是我的表格:

class BForm(forms.ModelForm):
    class Meta:
        model = B
        fields = ['description']

class AForm(forms.ModelForm):
    class Meta:
        model = A
        fields = ['name']

1 个答案:

答案 0 :(得分:2)

您的程序有多个错误,但主要问题是因为descclass A中指向class B的外键,而您没有null=True在它上面,这意味着你永远不希望那个字段为空。换句话说,A的每个实例都应该有一个外键desc

如果您只是save()这两种表单,formA会尝试保存A的实例,而没有desc字段的值,因此会出错。您应该将formB创建的实例分配给formA创建的实例:

new_b = formB.save()
new_a = formA.save(commit=False)
new_a.desc = new_b
new_a.save()

您的计划中的其他问题,包括从未调用form.is_valid(),有冗余id字段(django会为您创建一个)。我建议你在进入编码之前首先阅读django教程。它可以节省很多时间,比如搞清楚这样的错误。