django: messages.add_message не отображается на html-странице - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть приложение библиотеки 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 code:

  ......
  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'),
 ]

Произошла ошибка:

ValueError

Пожалуйста, предложите, что должно быть сделано, есть ли какое-либо другое решение, которое я могу попробовать для отображения окна предупреждения / сообщения на той же HTML-странице, без перенаправления на любую другую страницу.

Спасибо!

ОБНОВЛЕНИЕ:

Поскольку для book_detail присуща сложная маршрутизация URLHTML-страница, сообщения Django действительно отображаются, когда я использовал его на другой HTML-странице:

 def otherpage(request):
    ....
    messages.add_message(...)
    return render(request, 'other_page.html')

1 Ответ

0 голосов
/ 10 декабря 2018

Функция просмотра в 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')
...