如何在我的 Django 应用程序的“评论”视图中修复此错误?
Posted
技术标签:
【中文标题】如何在我的 Django 应用程序的“评论”视图中修复此错误?【英文标题】:How do i fix this error in my Comments view in my Django app? 【发布时间】:2020-04-07 20:26:11 【问题描述】:我正在尝试在 Django 中开发一个应用程序。目前,我正在尝试创建一个评论部分,供用户使用表单编写和提交 cmets。我制作了一个模板,其中显示了电影的信息以及用户可以通过它在电影上编写 cmets 的表单。
问题是当我写评论并尝试提交时,会出现这个错误:
/myapp2/2/ 处的完整性错误 NOT NULL 约束失败:myapp2_comentario.pelicula_id
我的 Views.py
def detallesPelicula(request, pelicula_id):
peliculas = get_list_or_404(Pelicula.objects.order_by('titulo'))
pelicula = get_object_or_404(Pelicula, pk=pelicula_id)
actor = get_list_or_404(Actor.objects)
comentarios = Comentario.objects.filter(pelicula=pelicula).order_by('fecha')
if request.method =='POST':
comment_form = CommentForm(data=request.POST)
if comment_form.is_valid():
comment_form.save()
texto = request.POST.get('texto')
comentario = Comentario.objects.create(
usuario=request.user, pelicula=pelicula, texto=texto)
comentario.save()
return HttpResponseRedirect(pelicula.get_absolute_url())
else:
comment_form= CommentForm()
context = 'pelicula': pelicula, 'peliculas': peliculas,
'comentarios':comentarios,'comment_form':comment_form
return render(request, 'detallesPelicula.html', context)
我的 Forms.py
class CommentForm(forms.ModelForm):
class Meta:
model = Comentario
fields = ['texto']
我的模型.py
class Comentario(models.Model):
usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE)
pelicula =models.ForeignKey(Pelicula, on_delete=models.CASCADE)
fecha = models.DateTimeField(auto_now_add=True,null=True,blank=True)
texto = models.TextField(max_length=2000, default="")
注意:用户取自 Django 认证系统。
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:# remove this line to fix the problem
comentario.save()
上述代码行没有设置pelicula
字段。您的 models.py 将其定义为必填字段,这就是您收到 IntegrityError 的原因。您可以删除代码,因为
上一行代码
# this should be valid because it contains all the required fields
comentario =
Comentario.objects.create(usuario=request.user, pelicula=pelicula, texto=texto)
已创建评论。
【讨论】:
【参考方案2】:comment_form.save()
将尝试创建一个新的评论,但表单没有设置 usuario 或 pelicula,因此出现错误。最好在表单中包含 pelicula 作为隐藏字段。但是对于用户,你可以这样做:
if comment_form.is_valid():
comentario = comment_form.save(commit=False)
comentario.usuario = self.request.user
comentario.save()
如果您的代码达到Comentario.objects.create
,则会创建第二个评论,因此如果第一个有效,则不需要。
【讨论】:
【参考方案3】:在代码行CommentForm(data=request.POST)
你可以试试CommentForm(request.POST or None)
。然后在 comment_form.save()
行中替换使用实例新对象注释 comentario = comment_form.save(commit=False)
请关注完成的代码
def detallesPelicula(request, pelicula_id):
peliculas = get_list_or_404(Pelicula.objects.order_by('titulo'))
pelicula = get_object_or_404(Pelicula, pk=pelicula_id)
actor = get_list_or_404(Actor.objects)
comentarios = Comentario.objects.filter(pelicula=pelicula).order_by('fecha')
# initialize form to generate form template and validation form on view
# request.POST or None (request.POST for POST method and None for GET method)
comment_form = CommentForm(request.POST or None)
if request.method == 'POST':
if comment_form.is_valid():
# instance new object comentario
comentario = comment_form.save(commit=False)
# to assign usuario attribute Comentario object from current user session
comentario.usuario = request.user
# assign pelicula attribute
comentario.pelicula = comentario
# commit comentario object to database
comentario.save()
return HttpResponseRedirect(pelicula.get_absolute_url())
context = 'pelicula': pelicula, 'peliculas': peliculas,
'comentarios':comentarios,'comment_form':comment_form
return render(request, 'detallesPelicula.html', context)
【讨论】:
以上是关于如何在我的 Django 应用程序的“评论”视图中修复此错误?的主要内容,如果未能解决你的问题,请参考以下文章
405 方法不允许,Django + ngrok,仅在我的本地机器上