Понимание представления django ModelForm
Я пытаюсь создать систему комментариев в блоге. Это раздел просмотра.
def post_content(request,post_slug):
post= Post.objects.get(slug=post_slug)
new_comment=None
#get all comments that are currently active to show in the post
comments= post.comments.filter(active=True)
if request.method=='POST':
comment_form= CommentForm(request.POST)
if comment_form.is_valid():
# saving a ModelForm creates an object of the corresponding model.
new_comment= comment_form.save(commit=False)
new_comment.post=post
new_comment.save()
else:
comment_form=CommentForm()
return render(request,'blog/post_content.html',{'post':post,'comments':comments,'comment_form':comment_form})
Там еще нет комментариев. Что я не понимаю, так это то, что когда я публикую комментарий, а затем страница перезагружается, я сразу же вижу комментарий (которым я не должен быть).
Насколько я понимаю, это должен быть поток. Когда страница перезагружается (после отправки комментария), она переходит к просмотрам и сначала получает активные комментарии (которые должны быть пустыми, потому что ни один еще не был сохранен, не так ли?) Он сохраняется только тогда, когда условие if выполнено и форма действительна, и все они приведены ниже. И я не получил комментарии после сохранения. Но все же переменная 'comments' содержит недавний комментарий, который я сделал. Как это происходит? Что это за колдовство? Пожалуйста, кто-нибудь, дайте мне понять!!
1 ответ
Вы упускаете то, что наборы запросов ленивы. Хотя вы создаете набор запросов до сохранения комментария, запрос фактически не выполняется до тех пор, пока вы не выполните итерацию, что происходит в самом шаблоне после сохранения нового комментария.
Обратите внимание, что, как отмечает Виллем в комментарии, вам действительно следует перенаправить на другую страницу после успешного сохранения. Это необходимо для предотвращения повторной отправки, если пользователь обновляет страницу. Вы можете перенаправить обратно на ту же страницу, если хотите, но важно то, что вы возвращаете перенаправление, а не проваливаетесь на рендер.
new_comment.save()
return redirect('post-comment', post_slug=post_slug)