Clatters
Clatters

Reputation: 17

Trying to link two models with a ForeignKey but get the error "IntegrityError NOT NULL"

I have a model where a user posts a job vacancy, then other users can submit applications. The submit application model is called 'CandidatesSubmission' & pulls the 'title' from a different app/model 'JobPosts'.

I can add submit applications through the ADMIN page fine, but when trying to do so with a form I get "IntegrityError NOT NULL constraint failed: candidates_candidatessubmission.title_id."

I believe that I'm missing something in my Views.py that essentially says "use the title of job vacancy as the title field.

I have tried adding null=True, blank=False but which stops the error but the title isn't saved to the database.

Any suggestions on what I'm doing wrong would be great. Thank you

models.py

class CandidatesSubmission(models.Model):

    title                   = models.ForeignKey('jobs.JobsPost', on_delete=models.CASCADE)
    Fee                     = models.CharField(max_length=50, null=False, blank=False)
    CandidateFirstName      = models.CharField(max_length=50, null=True, blank=False)
    CandidateSecondName     = models.CharField(max_length=50, null=True, blank=False)
    created                 = models.DateTimeField(auto_now_add=True)
    author                  = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

views.py

from django.shortcuts import render, redirect, get_object_or_404
from django.db.models import Q
from django.http import HttpResponseNotFound
from jobs.models import JobsPost
from candidates.models import CandidatesSubmission
from candidates.forms import CreateCandidatePostForm
from account.models import Account

from operator import attrgetter

# Create your views here.
def submit_candidates_view(request, slug):

    context = {}

    user = request.user
    if not user.is_authenticated:
        return redirect('must_authenticate')

    form = CreateCandidatePostForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        obj = form.save(commit=False)
        author = Account.objects.filter(email=user.email).first()
        obj.author = author
        
        obj.save()
        form = CreateCandidatePostForm()

    context['form'] = form

    accounts = CandidatesSubmission.objects.all()
    context['accounts'] = accounts

    return render(request, 'candidates/submit_candidates.html', context)


def response_view(request):

    context = {}

    accounts = CandidatesSubmission.objects.all()
    context['accounts'] = accounts


    return render(request, "candidates/response.html", context)

forms.py

from django import forms

from candidates.models import CandidatesSubmission

class CreateCandidatePostForm(forms.ModelForm):


    class Meta:
        model = CandidatesSubmission
        fields = ['Fee', 'CandidateFirstName', 'CandidateSecondName']

    def save(self, commit=True):
        submission_post = self.instance
        submission_post.Fee = self.cleaned_data['Fee']
        submission_post.CandidateFirstName = self.cleaned_data['CandidateFirstName']
        submission_post.CandidateSecondName = self.cleaned_data['CandidateSecondName']
        if commit:
            submission_post.save()
        return submission_post

Upvotes: 0

Views: 58

Answers (1)

Andrey Maslov
Andrey Maslov

Reputation: 1466

if you have "current" title, so your slug might store it, so you can use it like that.

def submit_candidates_view(request, slug):
    context = {}
    user = request.user
    if not user.is_authenticated:
        return redirect('must_authenticate')

    form = CreateCandidatePostForm(post_slug=slug, request.POST or None, request.FILES or None)
    if form.is_valid():
        obj = form.save(commit=False)
        author = Account.objects.filter(email=user.email).first()
        obj.author = author
        
        obj.save()
        form = CreateCandidatePostForm()

    context['form'] = form

    accounts = CandidatesSubmission.objects.all()
    context['accounts'] = accounts

    return render(request, 'candidates/submit_candidates.html', context)

in your forms.py we replace __init__ method to receive slug of your title

class CreateCandidatePostForm(forms.ModelForm):
    class Meta:
        model = CandidatesSubmission
        fields = ['Fee', 'CandidateFirstName', 'CandidateSecondName']

    def __init__(self, *args, **kwargs):
        self.post_slug = kwargs.pop("post_slug", None)
        super().__init__(*args, **kwargs)

    def save(self, commit=True):
        submission_post = self.instance
        submission_post.title = JobsPost.objects.get(slug=self.post_slug)
        if commit:
            submission_post.save()
        return submission_post

Upvotes: 1

Related Questions