首页 > 解决方案 > 尝试使用 ForeignKey 链接两个模型,但收到错误“IntegrityError NOT NULL”

问题描述

我有一个模型,用户发布职位空缺,然后其他用户可以提交申请。提交应用程序模型称为“CandidatesSubmission”并从不同的应用程序/模型“JobPosts”中提取“标题”。

我可以通过 ADMIN 页面很好地添加提交申请,但是当尝试使用表单执行此操作时,我得到“IntegrityError NOT NULL 约束失败: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)

表格.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

标签: pythondjango

解决方案


如果您有“当前”标题,那么您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

推荐阅读