提交时的完整性错误
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
方法来设置reporter
和reports
(到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/…以上是关于提交时的完整性错误的主要内容,如果未能解决你的问题,请参考以下文章