【问题标题】:How do i fix this error in my Comments view in my Django app?如何在我的 Django 应用程序的“评论”视图中修复此错误?
【发布时间】: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 认证系统。

非常感谢您的帮助。

【问题讨论】:

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


    【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 2021-12-19
          • 1970-01-01
          • 2020-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-18
          • 2019-11-23
          • 1970-01-01
          相关资源
          最近更新 更多