#python #django #django-views #django-signals #django-notification
#python #django #django-просмотры #django-сигналы #django-уведомление
Вопрос:
Я намереваюсь удалить уведомление в пакете django-notifications-hq, отключив сигнал в моих представлениях после создания сигнала:
В качестве примера:
def view1:
notify.send(sender=user, recipient=other_user, verb=message, target=object)
return redirect('app:page')
def view2:
notify.disconnect(sender=user, reciever=other_user)
return redirect('app:page2')
user и other_user — одни и те же пользователи в этом примере
Это отключит все сигналы между user
и other_user
, что я намерен сделать, это отключить только сигнал, созданный между этими пользователями для этого конкретного объекта.
Я уже просмотрел исходный код и не могу найти, как мне это сделать.
Для справки, ссылка на GitHub: https://github.com/django-notifications/django-notifications
Также это файл сигналов в этом пакете:
''' Django notifications signal file '''
# -*- coding: utf-8 -*-
from django.dispatch import Signal
notify = Signal(providing_args=[ # pylint: disable=invalid-name
'recipient', 'actor', 'verb', 'action_object', 'target', 'description',
'timestamp', 'level'
])
Редактировать
Вот более наглядный пример того, чего я пытаюсь достичь:
в моем app/views.py
У меня есть:
def post_like(request, id):
post = get_objects_or_404(Post, id=id)
if request.user in post.likes:
post.likes.remove(request.user)
# remove notification sent to post.author here
elif request.user not in post.likes:
post.likes.add(request.user)
notify.send(sender=request.user, recipient=post.author, verb="Liked your post", target = post)
"""
Continue other functions here
"""
Как я могу подключить и отключить сигналы для этого представления? Я не могу найти пример в документации.
Редактировать
Я пытаюсь получить конкретное уведомление в соответствии с полем модели уведомлений:
request.user.notifications.get(actor_content_type__model='Profile', actor_object_id=request.user.id, target_content_type__model='home.Post', target_object_id=post.id, recipient=post.author, verb=message)
Я получил сообщение об ошибке:
raise self.model.DoesNotExist(
main.models.Notification.DoesNotExist: Notification matching query does not exist.
После проверки больше я заметил:
AttributeError: 'Notification' object has no attribute 'actor_content_type__model'
Комментарии:
1. Ваш вопрос действительно должен касаться сигналов, а не уведомлений, но между тем, как и когда вызывается page2 или, скорее, view2.
2. Итак, как вы предлагаете мне отключать сигнал с этими определенными параметрами в любое время, на мой взгляд. View2 можно вызвать в любое время в любой точке моего приложения, я хочу иметь возможность удалять созданный сигнал с этими объектами в любое время. @unlockme
3. Посмотрите на это github.com/django-notifications /… информация # Уведомления лучше всего делать в отдельном сигнале. Таким образом, вы можете отключить этот обработчик.
def my_handler(sender, instance, created, **kwargs): notify.send(instance, verb='was saved') request_finished.connect(my_handler), request_finished.disconnect(my_handler)
Попробуйте это.4. @unlockme спасибо за вашу информацию, но, к сожалению, я не могу этого сделать, я не могу найти способ отключить обработчик для конкретного аргумента уведомления. Я привел пример того, как я отправляю свои уведомления сейчас
5. Мне кажется, когда вы говорите отключить уведомление. Вы имеете в виду, что хотите, чтобы созданные уведомления не отображались для пользователя. Надеюсь, вы знаете, что notify.send фактически создает новый экземпляр уведомления в базе данных. В этом случае вы можете пометить конкретное уведомление как прочитанное. @ashes999