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')
Другие вопросы по тегам