我得到错误:
/projects/1/issues/new处的IntegrityError/NOT NULL约束失败:issues_issue.project_id请求方式:POST请求URL:http://127.0.0.1:8000/projects/1/issues/new/Django版本:3.0.3异常类型:IntegrityError异常值:
NOT NULL约束失败:issues_issue.project_id
Issues有一个外键要项目,我在form_valid方法中分配它,我对用户也这样做,这很好
在视图中创建视图.py:
class IssueCreateView(LoginRequiredMixin, CreateView):
model = Issue
fields = ['title', 'details', 'priority', 'status', 'estimated_work_hours', 'loaded_work_hours']
def form_valid(self, form):
form.instance.project = get_object_or_404(Project, pk=self.kwargs['project_id'])
print(form.instance.project)
form.instance.creator = self.request.user
return super().form_valid(form)
行print(form.instance.project)
打印正确的项目,所以这是有效的。
models.py:
class Issue(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
creator = models.ForeignKey(User, related_name="%(class)ss_created", on_delete=models.CASCADE)
...
...
为什么我可以在form_valid方法中将创建者字段分配给用户,但当我对Project字段做同样的事情时,它不起作用,我不理解。
有人知道问题出在哪里吗?
感谢
您的表单不支持实例中的project
和creator
。如果你只设置form.instance.xyz = self.request.user
,它几乎是一样的
因此,您必须将project
和creator
添加到字段中。
如果您使用{{ form.as_p }}
,您将遇到下一个问题,即这些字段包含在表单中。有多种方法可以处理此问题。一种是将它们隐藏在自定义表单中。最终结果是:
from django import forms
class IssueForm(forms.ModelForm):
class Meta:
model = Issue
fields = ['project', 'creator', 'title', 'details', 'priority', 'status', 'estimated_work_hours', 'loaded_work_hours']
widgets = {
'project': forms.HiddenInput(),
'creator': forms.HiddenInput(),
}
class IssueCreateView(LoginRequiredMixin, CreateView):
model = Issue
form_class = IssueForm
def form_valid(self, form):
form.instance.project = get_object_or_404(Project, pk=self.kwargs['project_id'])
form.instance.creator = self.request.user
return super().form_valid(form)