Django notification hq mark_as_read
Я использую django-notifications-hq для обеспечения работы уведомлений в приложении Django. У меня проблемы с функцией "mark_as_read". Я пытаюсь добиться того, чтобы иметь список уведомлений и, при нажатии на уведомление, отмечать его как прочитанное и перенаправлять на url сообщения. Проблема в том, что в принципе у меня с этим проблемы. Я перепробовал много различных способов на шаблоне, таких как:
<a href="{% url 'main:question_details' pk=notification.target.question.id slug=notification.target.question.slug %}?next={{notification.mark_as_read}}" class="text-reset notification-item">
{% if notification.unread == True %}
<div class="d-flex alert-warning">
{% else %}
<div class="d-flex">
{% endif %}
<div class="flex-1">
<span class="text-dark small">Commento</span>
<span class="text-dark small float-end"><i class="mdi mdi-clock-outline"></i> {{notification.timestamp|naturaltime}}</span>
<h6 class="mb-1">{{notification.verb}}</h6>
<div class="font-size-12 text-muted">
<p class="mb-1">{{ notification.target.comment }}</p>
</div>
</div>
</div>
</a>
В этом случае перенаправление работает, но как только я нажимаю на выпадающее меню, уведомление уже помечено как прочитанное.
Если я убираю ?next={{notification.mark_as_read}}
, то перенаправление работает, но уведомление не помечается как прочитанное.
Кто-нибудь сталкивался с подобной проблемой при работе с уведомлениями на django?
Очень трудно получить полное представление о том, что идет не так, только из фрагмента шаблона.
Я могу только заключить, что в main:question_details
нет никакой логики для фактического установления mark_as_read=True
. ?next={{notification.mark_as_read}}
просто добавляет немного дополнительных данных в запрос, значение True или False. Не помечая его как прочитанный.
И даже если бы у вас была логика в представлении деталей, чтобы сделать что-то, если next=True, как бы вы узнали, какое уведомление отметить как прочитанное?
Я бы, возможно, изменил href со ссылки непосредственно на вопрос_детали, а сделал бы перенаправление для уведомлений.
<a href="{% url 'main:open_notification' pk=notification.id" %}>
тогда у вас будет простой вид, который будет выглядеть примерно так:
def open_notification(request, notification_id):
notifcation = get_or_404(Notifcation, {"pk":notification_id, "recipient": request.user})
notifcation.mark_as_read()
return redirect(notifcation.target.get_absolute_url())
Это означает, что вы можете обобщить шаблон уведомления, так что могут быть уведомления для чего угодно другого, пока цель уведомления имеет url, на который он хочет перенаправить пользователей.
Другой вариант, это иметь значение запроса ?next=url
к open_notification url, так что вы можете указать, на какой url вы хотите направить пользователя после того, как уведомление будет помечено как прочитанное, при отображении herf
.