MintDrop MintDrop - 6 months ago 17
SQL Question

Django - id null - foreign key error

Hello fellow Djangoist,

I've been stuck with this error for almost a week now and it's driving me crazy!

Error:


app_a.desc_id may not be NULL


I believe my problem is I'm not passing the
id
from
formB
to
formA
when I save. please please lead me to a solution for this problem.

Here's my view:

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')


Here are my models:

# 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)


and here is my form:

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

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

Answer

Your program has multiple errors but the main problem for this is because desc is a foreign key in class A that points to class B, and you don't have null=True on it, meaning you never want that field to be empty. In other words, each instance of A should have a foreign key desc.

If you just save() both forms, formA tries to save an instance of A, without having a value for desc field, hence the error. You should assign the instance that formB creates to the instance that formA creates:

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

Other problems in your program including never called form.is_valid(), having redundant id fields(django would create one for you). I suggest you read django tutorial first before jumping into coding. It would save a lot of time like figuring out errors like this.

Comments