如何在Django应用的“评论”视图中解决此错误?

时间:2019-12-14 19:48:18

标签: django forms django-models django-forms django-views

我正在尝试在Django中开发应用程序。目前,我正在尝试为用户创建评论部分,以便用户使用表单编写和提交评论。我制作了一个模板,用于显示电影的信息以及用户可以在电影上发表评论的表格。

问题是当我写评论并尝试提交时,出现此错误:

/ myapp2 / 2 / 中的IntegrityError 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']

我的Models.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身份验证系统。

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

contours = plot.contour(XPoints, YPoints, ZPoints, 50

上面的代码行没有设置# remove this line to fix the problem comentario.save() 字段。您的models.py将其定义为必填字段,这就是为什么您收到IntegrityError的原因。您可以删除代码,因为 前一行代码

pelicula

已经创建了评论。

答案 1 :(得分:0)

comment_form.save()

将尝试创建一个新的Comment,但是该表单未设置usuario或pelicula,因此会出现错误。最好将鹈鹕以隐藏字段的形式包括在内。但是对于用户,您可以执行以下操作:

    if comment_form.is_valid():
        comentario = comment_form.save(commit=False)
        comentario.usuario = self.request.user
        comentario.save()

如果您的代码到达Comentario.objects.create,则将创建第二条注释,因此,如果不需要第一条注释,则

答案 2 :(得分:0)

在代码行 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)