我的视图没有从 Django 中的 Form 中保存实例

Posted

技术标签:

【中文标题】我的视图没有从 Django 中的 Form 中保存实例【英文标题】:My view doesn't save the instance from Form in Djagno 【发布时间】:2021-04-08 22:51:03 【问题描述】:

我正在尝试为我的问答项目制作评论部分。我制作了 model 用于评论,question_detail.html 中的表单部分,也是 QuestionCommentForm() 在 form.py 中。

模型.py

class QuestionComment(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    question = 
    models.ForeignKey(Question,on_delete=models.CASCADE)
    created_date = models.DateTimeField(auto_now_add= True)
    body = models.CharField(max_length=200, null= True , 
    blank = True, default ='')
    def __str__(self):
    return str(self.body)

forms.py

          %if c_form%
    <form method="POST" action= "% usl 'blog:question-commet' question.id  >% csrf_token %
    c_form.media
     c_form.as_p
      <button type = "submit" , name = "question_id", value = "question.pk", class ="btn btn-secondary btn-sm">submit comment</button>

views.py

@api_view(['POST','GET'])
def question_comment(request, *args, **kwargs):
    form = QuestionCommentForm()
     print('finction comment started'*20)
     if request.method == 'POST':
        c_form = QuestionCommentForm(request.POST)
        if c_form.is_valid():        
            new_comment = c_form.save(commit=False)
            new_comment.refresh_from_db()
            c_form.instance.user = request.user
            question = Question.objects.get(id = request.POST.get('question_id')

            new_comment.question = question
            new_comment.bldy =c_form.cleaned_data.get('body')
            new_comment.save()
    context['c_form'] = c_form
    return render(request, 'blog/question_detail.html',context)

class QuestionDetail(DetailView):
    template_name = 'blog/question_detail.html'
    model = Question
    context_object_name = 'question'
    count_hit = True
    def get_queryset(self):
        return Question.objects.filter(id = self.kwargs['pk'])

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        c_form = QuestionCommentForm()
        context = super(QuestionDetail,self).get_context_data(**kwargs)
        self.obj= get_object_or_404(Question, id = self.kwargs['pk'])
        self.object.save()
        self.object.refresh_from_db()
        answers = Answer.objects.filter (question_id = self.obj.id).order_by('-created_date')
        liked =self.obj.like.filter(id =self.request.user.id).exists()
        print('liked in class question not checked still' *10)
        comments= QuestionComment.objects.filter(question = self.kwargs['pk'])
        context['comments']= comments
        context["answers"]=answers
        context["liked "] = liked
        context['c_form'] = c_form
        return context

    def post(request, *args, **kwargs):
        print('post started'*100)
        c_form = QuestionCommentForm()
        c_form = QuestionCommentForm(request.POST)
        if c_form.is_valid():        
            new_comment = c_form.save(commit=False)
            new_comment.refresh_from_db()
            new_comment.user = request.user
            new_comment.question = c_form.cleaned_data.get('question_id')
            new_comment.bldy =c_form.cleaned_data.get('body')
            new_comment.save()
            context['c_form'] = c_form
        else:
            c_form= QuestionCommentForm()
        return render(request, 'blog/question_detail.html',context)
    

url.py

...
path('question-comment/<int:pk>/', question_comment, name = 'question-comment'),

]

在我看来,首先我尝试使用另一个函数来处理评论,没有得到任何结果并制作了 def post()class QuestionDetial() 中,仍然会显示表单,但是当我输入内容并点击按钮时,它会刷新页面并且没有任何保存。我已经使用管理员保存了一条评论,它出现在问题详细信息页面中。使用 print 来查找错误,但似乎 post() 类和 question_comment() 没有被召回。搜索了很多但没有答案。 (顺便说一句,除了我修复的 NoReverseMatch 之外,我没有收到任何错误)

【问题讨论】:

提前谢谢 【参考方案1】:

您永远不会保存模型对象(不是通过表单,也不是通过视图)。此外,该方法的名称是'POST',而不是'Post'

@api_view(['POST','GET'])
def question_comment(request, *args, **kwargs):
    form = QuestionCommentForm()
    print('finction comment started'*20)
    if request.method == 'POST':
        c_form = QuestionCommentForm(request.POST)
        if c_form.is_valid():        
            c_form.instance.user = request.user
            c_form.save()
    context = 'c_form': c_form 
    return render(request, 'blog/question_detail.html',context)

【讨论】:

谢谢,但我已经做到了(课堂上的 .save()),我按照你现在所说的进行了更改,但仍然没有保存,我的 print() 函数在 question_comment() 中都不起作用并在 QuestionComment 类的 post 方法中。 @RoohollahMozaffari:不,因为您仍然没有更改request.method == 'POST' 检查,所以if 逻辑是从不执行的。它也会出错,因为request.Post not 也不存在。【参考方案2】:

好的,问题是我在 question_detail 模板中有两个表单标签,并在模板末尾添加评论表单有 3,但问题是当我按下 提交评论按钮终端显示这条消息

"POST /create-like/blog/answer/18/ HTTP/1.1" 302 0

这是我为类似功能制作的形式。(而我的网址是 question-comment) 我不小心忘记关闭模板中的 like-form 标签。所以我只需要放一个

 </form>

在表单块之后。 谢谢Willem Van Onsem。它解决了我的发布方法错误。 这些非常有帮助

Proper way to handle multiple forms on one page in Django

How can I build multiple submit buttons django form?

【讨论】:

以上是关于我的视图没有从 Django 中的 Form 中保存实例的主要内容,如果未能解决你的问题,请参考以下文章

在 rails 中保存单选按钮值

Django - forms.Form 无法保存当前用户并且表单有效但未保存

如何在 TabView SwiftUI 中保存视图的列表状态

从视图中使用Django保存表单

如何从视图将值传递给 Django Form init 方法?

django 模板中的“form.as_p”从何而来?