Понимание представления django ModelForm - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь создать систему комментариев в блоге. Это раздел просмотра.

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 Ответ

0 голосов
/ 03 сентября 2018

Вам не хватает того, что наборы запросов ленивы . Хотя вы создаете набор запросов до сохранения комментария, запрос фактически не выполняется до тех пор, пока вы не выполните итерацию, что происходит в самом шаблоне после сохранения нового комментария.

Обратите внимание, что, как указывает Виллем в комментарии, вам действительно следует перенаправить на другую страницу после успешного сохранения. Это необходимо для предотвращения повторной отправки, если пользователь обновляет страницу. Вы можете перенаправить обратно на ту же страницу, если хотите, но важно то, что вы возвращаете перенаправление, а не проваливаетесь на рендер.

new_comment.save()
return redirect('post-comment', post_slug=post_slug)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...