comment.content_object.user
правильный. Но эта проблема хитрая. Поскольку комментарий можно прикрепить к любой модели, вы не знаете, имеет ли эта модель поле user
. Во многих случаях могут быть разные названия этого поля, т.е. Если у вас есть комментарий к article
, статья может иметь article.author
, и если у вас есть модель car
, и вы комментируете ее, вероятно, будет car.owner
. Поэтому использование .user
для этой цели не будет работать в этих случаях.
Мое предложение для решения этой проблемы - составить список возможных ролей, заинтересованных в комментарии, и попытаться отправить сообщение всем им:
from django.contrib.comments.signals import comment_was_posted
if "notification" in settings.INSTALLED_APPS:
from notification import models as notification
def comment_notification(sender, comment, request, **kwargs):
subject = comment.content_object
for role in ['user', 'author', 'owner', 'creator', 'leader', 'maker', 'type any more']:
if hasattr(subject, role) and isinstance(getattr(subject, role), User):
user = getattr(subject, role)
message = comment
notification.send([user], "new_comment", {'message': message,})
comment_was_posted.connect(comment_notification)
Вам также следует переместить этот список к какому-то королю конфигурации:
from django.contrib.comments.signals import comment_was_posted
default_roles = ['user', 'author', 'owner']
_roles = settings.get('MYAPP_ROLES', default_roles)
if "notification" in settings.INSTALLED_APPS:
from notification import models as notification
def comment_notification(sender, comment, request, **kwargs):
subject = comment.content_object
for role in _roles:
if hasattr(subject, role) and isinstance(getattr(subject, role), User):
user = getattr(subject, role)
message = comment
notification.send([user], "new_comment", {'message': message,})
comment_was_posted.connect(comment_notification)
Другим подходом к этой проблеме может быть создание механизма, который переводит class
в role
. Но гораздо сложнее понять это правильно, поэтому вы, вероятно, не хотите этого делать.