提交时的完整性错误

Posted

技术标签:

【中文标题】提交时的完整性错误【英文标题】:IntegrityError when submit 【发布时间】:2020-06-27 00:56:28 【问题描述】:

我正在创建这个应用程序,我希望能够向管理员数据库报告电影。目前我可以去看电影,然后点击report,然后被发送到report_form模板。但是当我点击这个模板上的报告按钮时,我只得到这个,并且在数据库中没有任何反应: 异常类型:IntegrityError 异常值:NOT NULL 约束失败:board_report.reporter_id

有人对此有解决方案吗?

report_form.html

% extends "board/base.html" %
% load crispy_forms_tags %
% load materializecss %
% block content %
<div class="valign-wrapper row login-box">
    <div class="col card hoverable s10 pull-s1 m6 pull-m3 l8 pull-l2">
        <form method="POST" action="" enctype="multipart/form-data">
            % csrf_token %
            <div class="card-content">
                <span class="card-title">Jusity why you want to report this film?</span>
                <div class="row">
                     form|materializecss 
                </div>
            </div>
            <div class="card-action right-align">
                <input type="reset" id="reset" class="btn-flat grey-text waves-effect">
                <input type="submit" class="btn green waves-effect waves-light" value="Report">
            </div>
        </form>
    </div>
</div>
% endblock content %

models.py

class Report(models.Model):
    reason = models.TextField()
    reporter = models.ForeignKey(User, on_delete=models.CASCADE, related_name="Reporter")
    reports = models.ForeignKey(Film, on_delete=models.CASCADE)

    def __str__(self):  # pragma: no cover
        return f"self.reports.title reported by self.reporter.username"

    def get_absolute_url(self):  # pragma: no cover
        return reverse("film-detail", kwargs="pk": self.pk)

views.py

class FilmReport(LoginRequiredMixin, CreateView):
    model = Report
    fields = ["reason"]

    def __str__(self):
        return self.title

urls.py

urlpatterns = [
    path("", views.films_view, name="board-home"),
    path("film/add", FilmAddView.as_view(), name="film-add"),
    path("film/<int:pk>/", FilmDetailView.as_view(), name="film-detail"),
    path("film/<int:pk>/report", FilmReport.as_view(), name="film-report"),
]

【问题讨论】:

这意味着您没有为 reporter 添加值(也没有为 film 添加值)。 【参考方案1】:

这意味着您没有为reporter 添加值(也没有为reports 添加值),因此数据库拒绝创建。

您可以通过覆盖form_valid 方法来设置reporterreports(到URL 中的pk):

class FilmReportView(LoginRequiredMixin, CreateView):
    model = Report
    fields = ['reason']

    def form_valid(self, form):
        form.instance.reporter = self.request.user
        form.instance.reports_id = self.kwargs['pk']
        return super().form_valid(form)

为视图实现__str__ 并不常见。此外,视图没有标题,因此 self.title 将不起作用。

注意:在 Django 中,基于类的视图 (CBV) 通常有一个 View 后缀,所以你应该 考虑将视图类重命名为 FilmReportView,而不是 FilmReport

【讨论】:

我实施了您的更改,错误消失了。现在我明白了:“视图 board.views.FilmReportView 没有返回 HttpResponse 对象。它返回了 None。” @Jonas:抱歉忘了return。但很可能该记录已经在数据库中,它只是没有重定向到成功的 url。 只是一个简单的问题。当我报告这部电影时,我会被重定向到数据库中的下一部电影。这是为什么呢? @Jonas:由于您没有在视图中定义success_url,它将重定向到您创建的对象的get_absolute_url(这里是Report)。可能包含此网址(有点“奇怪”)。有关更多信息,请参阅docs.djangoproject.com/en/3.0/ref/class-based-views/…

以上是关于提交时的完整性错误的主要内容,如果未能解决你的问题,请参考以下文章

修复使用 Python 和 sql 时的完整性错误?

完整性检查时的 sqlite nomem 错误

坚持时的教义关联完整性约束

打开散列c ++时的“不完整类型”

完整的docker打包到生成容器的过程

postgres WAL归档