django: messages.add_message не отображается на html-странице
У меня есть приложение библиотеки Django, где у меня есть страница book_detail, на которой пользователь может загрузить / отправить по электронной почте ссылку на книгу в формате pdf.
При отправке такого электронного письма (которое работает отлично, электронное письмо принимается) я хочу отобразить всплывающее окно или сообщение с предупреждением на той же HTML-странице, а не перенаправлять на какую-либо другую страницу.
Вот код views.py:
def send_email(request):
try:
send_mail('Book request', 'email body', settings.EMAIL_HOST_USER, ['xyz@gmail.com'], fail_silently=False)
#this message is not getting displayed in the same html page
messages.add_message(request, messages.SUCCESS, 'Email sent successfully.')
except EmailMessage:
messages.add_message(request, messages.SUCCESS, 'Error has occurred')
HTML-код book_detail.html:
......
rest of the code....
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endblock %}
Я использую кнопку отправки, чтобы отправить электронное письмо:
urlpatterns = [
path('', views.index, name='index'),
......
path('email_book/', views.send_email, name='email_book'),
]
Произошла ошибка:
Пожалуйста, предложите, что должно быть сделано, есть ли какое-то другое решение, которое я могу попробовать для отображения окна оповещения / сообщения на той же HTML-странице, не перенаправляя его на любую другую страницу.
Спасибо!
ОБНОВИТЬ:
Поскольку для страницы book_detail.html присуща сложная маршрутизация URL, сообщения django действительно отображаются, когда я использовал их на какой-то другой html-странице:
def otherpage(request):
....
messages.add_message(...)
return render(request, 'other_page.html')
1 ответ
Функция просмотра в Django всегда должна возвращать Response
объект
def send_email(request):
try:
send_mail('Book request', 'email body', settings.EMAIL_HOST_USER, ['xyz@gmail.com'], fail_silently=False)
#this message is not getting displayed in the same html page
messages.add_message(request, messages.SUCCESS, 'Email sent successfully.')
except smtplib.SMTPException:
messages.add_message(request, messages.SUCCESS, 'Error has occurred')
return render(request, 'book_detail.html', {
'messages': messages,
}, content_type='text/html')