我的视图没有从 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 中保存实例的主要内容,如果未能解决你的问题,请参考以下文章
Django - forms.Form 无法保存当前用户并且表单有效但未保存
如何在 TabView SwiftUI 中保存视图的列表状态