首页 > 解决方案 > 无法在 form_valid 方法中分配字段,非空约束错误

问题描述

我收到错误:

/projects/1/issues/new/ NOT NULL 约束处​​的 IntegrityError 失败: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

问题有一个项目的外键,我在 form_valid 方法中分配它,我对用户做同样的事情,效果很好

在views.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)打印了正确的项目,因此可以正常工作。

模型.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 字段执行相同操作时,它不起作用,我不明白。

有谁知道可能是什么问题?

谢谢

标签: djangodjango-views

解决方案


您的表格不尊重您projectcreator情况。如果您刚刚设置,它几乎相同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)

推荐阅读