#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, никогда не отображает шаблоны. Он перенаправляет на шаблон, который затем извлекается и отображается. Поэтому я думаю, что часть для отображения комментариев не относится к этому представлению.