Мои комментарии не отображаются на странице HTML

#python #django

#python #django

Вопрос:

Эй, ребята, я создаю сайт аукциона, и по какой-то причине мои комментарии (dict, называемый commentQuery) не отображаются на странице HTML.

Кто-нибудь понимает, почему? Я уверен, что это что-то незначительное, чего мне не хватает.

Спасибо! соответствующий код ниже:

views.py:

 def comment(request):
username = request.POST.get("username")
itemID = request.POST.get("itemID")
comment = request.POST.get("comment")
new = Comment.objects.create(username = username, comment = comment, itemID = itemID)
new.save()
commentQuery = Comment.objects.all()
return render(request, "auctions/post.html", { "commentQuery": commentQueries})
  

post.html:

     <form name="comment"
          action="/comment"
          method="post">
        {% csrf_token %}
    <h2>Comments</h2>
    {% if user.is_authenticated %}
    <input autofocus class="form-control" type="text" name="comment" placeholder="Enter Comment">
    <input autofocus class="form-control" type="hidden" name="itemID" value={{p.title}}{{p.price}}>
    <input autofocus class="form-control" type="hidden" name="username" value={{user.username}}>
    <input class="btn btn-primary" type="submit" value="Add Comment">
    {% endif %}
    </form>
{% for commentQuery in commentQueries %}
            <li>{{ commentQuery.comment }} by {{ commentQueries.username }}</li>
{% endfor %} 
        
{% endblock %}
  

Комментарии:

1. Вы передали commentQueries в шаблон как commentQuery , а не commentQueries как …

2. У меня есть как commentQuery.comment, так и commentQueries.username — ни один из них не отображается. Я пробовал и то, и другое

3. проблема не в той {{ commentQuery.comment }} части, проблема возникает в {% for ... %} цикле.

4. Хорошо, теперь я понял, спасибо. Комментарии отображаются только тогда, когда я нажимаю кнопку добавить новый комментарий. Я должен выяснить, как просто отображать комментарии при выполнении GET. Но я не уверен, как это сделать, поскольку действие «/ comment» запускается только тогда, когда кто-то нажимает «Добавить комментарий».

Ответ №1:

Вы передали commentQueries шаблон под именем commentQuery , следовательно, если вы напишете {% for commentQuery in commentQueries %} , это не сработает. Вы должны передать его как commentQueries , или, возможно, более удобный comments :

 def comment(request):
    username = request.POST.get('username')
    itemID = request.POST.get('itemID')
    comment = request.POST.get('comment')
    Comment.objects.create(
        username=username,
        comment=comment,
        itemID=itemID
    )
    comments = Comment.objects.all()
    return render(request, 'auctions/post.html', { 'comments': comments})  

Затем в шаблоне вы можете отобразить комментарии:

 {% for comment in comments %}
    <li>{{ comment.comment }} by {{ comment.username }}</li>
{% endfor %}  

Однако, возможно, было бы лучше работать с ForeignKey [Django-doc] для модели пользователя, а не сохранять имя пользователя. Если вы скопируете имя пользователя, а позже пользователь изменит свое имя пользователя, вы больше не сможете получать пользовательские данные об этом пользователе, например.


Примечание: В случае успешного запроса POST вам следует создать redirect [Django-doc] для реализации шаблона Post / Redirect / Get [wiki]. Это позволяет избежать того, что вы делаете один и тот же запрос POST, когда пользователь обновляет браузер.

Комментарии:

1. Спасибо за всю информацию — пока я просто хочу заставить ее работать, прежде чем добавлять другие материалы — но я рассмотрю это — спасибо! Тем не менее, я пробую ваш метод с комментариями… У меня все точно так, как вы его ввели, и ничего не отображается по-прежнему.

2. Вы перешли к контексту { 'comments': comments} с comments = Comment.objects.all() помощью?

3. Хорошо, я разобрался с проблемой. Комментарии отображаются только после добавления нового комментария. Я должен найти способ, при котором он просто отображается без добавления нового комментария.

4. @card51short: вы должны проверить if request.method == 'POST' и только в этом случае создать новый Comment .

5. @card51short: вам нужно будет добавить логику в функцию просмотра , где вы отображаете страницу. Таким образом, в случае успешного запроса POST вы также должны перенаправить на эту страницу. Часто представление, которое обновляет объекты в запросе POST, никогда не отображает шаблоны. Он перенаправляет на шаблон, который затем извлекается и отображается. Поэтому я думаю, что часть для отображения комментариев не относится к этому представлению.