簡體   English   中英

嘗試使用 ForeignKey 鏈接兩個模型但出現錯誤“IntegrityError NOT NULL”

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

我有一個 model 用戶發布職位空缺,然后其他用戶可以提交申請。 提交申請 model 稱為“CandidatesSubmission”並從不同的應用程序/模型“JobPosts”中提取“標題”。

我可以通過 ADMIN 頁面添加提交申請,但是當嘗試使用表單這樣做時,我得到“IntegrityError NOT NULL constraint failed: candidates_candidatessubmission.title_id.”

我相信我在我的 Views.py 中遺漏了一些內容,基本上說“使用職位空缺的標題作為標題字段。

我嘗試添加 null=True, blank=False 但這會停止錯誤但標題不會保存到數據庫中。

關於我做錯了什么的任何建議都會很棒。 謝謝

模型.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)

視圖.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

如果您有“當前”標題,那么您的slug可能會存儲它,因此您可以那樣使用它。

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)

在您的 forms.py 中,我們替換__init__方法來接收您的標題

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM