python - 尝试使用 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
解决方案
如果您有“当前”标题,那么您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
推荐阅读
- javascript - 如何仅增加桌面设备的字体大小
- javascript - 如何将高度设置为宿主元素而不是 @media 类(对于同一元素)
- python - 重定向到烧瓶中的不同路线
- c# - 从数据表中选择数据
- android - 在 GlSurfaceView.Renderer 实现中旋转视频的矩阵(帧)
- dart - 如何在飞镖中进行从超类到子类的回调
- c++ - 其中之一与其他不同:为什么 std::vector::size 在所有主要标准库实现中都以指针的形式实现?
- c++ - HC-05蓝牙模块需要每指令3次
- java - Java 泛型:无法转换列表
> 列出 - angular - 如何多选角