Jonas Fredriksson
Jonas Fredriksson

Reputation: 355

NOT NULL constraint failed error when using createview in django

I am trying to create a new entry in my model using createview. the model Venue is in a onetone relation with Adress model and I cannot get it to upate that model. I have tried to use a custom form but I always get the following error:

IntegrityError at /evcreate/

NOT NULL constraint failed: kammem_person.padress_id

form.py:

class AdressForm(ModelForm):

    street=CharField(max_length=100)
    snumb=CharField(max_length=15)
    town=CharField(max_length=100)
    postn=CharField(max_length=5,validators=[postnvali])
    
    class Meta:
        model=Person
        exclude=['padress']

view:

class EvCreate(CreateView):

    form_class=AdressForm
    template_name='kammem/create.html'
    success_url=reverse_lazy('event')

    def form_valid(self,form):
        
        street=form.cleaned_data['street']
        snumb=form.cleaned_data['snumb']
        town=form.cleaned_data['street']
        postn=form.cleaned_data['postn']
        form.vadress=Adress.objects.create(street=street,snumb=snumb,town=town,postn=postn)

        return super().form_valid(form)

models.py

class Person(Model):

    fname=CharField(default="missing",max_length=100)
    lname=CharField(default="missing",max_length=100)
    mobil=PhoneField(default='9999999999')
    mail=EmailField(default='[email protected]')
    padress=OneToOneField(Adress,on_delete=CASCADE,primary_key=True)

    def __str__(self):
        return self.fname

    class Meta:
        ordering=('fname','lname')

class Venue(Model):

    vname=CharField(default="",max_length=100)
    vamil=EmailField(default='[email protected]')
    vpage=CharField(default='homepage',max_length=100)
    vadress=OneToOneField(Adress,on_delete=CASCADE,,primary_key=True)
    
    def __str__(self):
        return 'Venue: ' + self.vname

url.py

   path('evcreate/',EvCreate.as_view(),name='evcreate'),

I have really searched for an answer but with no succes. Any clues?

Upvotes: 0

Views: 344

Answers (1)

rahul.m
rahul.m

Reputation: 5854

You are missing padress which you have set as Primary Key.

In AdressForm you have excluded padress and Django creates view automatically creates the object if the form is valid.

try something like this

def form_valid(self,form):
    form.padress = # Adress object
    form.save()
    # rest 

Upvotes: 0

Related Questions